我已經成功C 地用SWIG. 我發布了該模塊并且可以正常安裝它,但是當我去構建它時undefined reference,生成的c檔案中包含的函式會出現大量錯誤。
我將生成的solib檔案放在我的系統lib目錄中,并將庫中的頭檔案放在我的系統include目錄中,但這并沒有解決問題。我猜我也需要一個用于包裝c檔案的頭檔案,以便解釋器知道so檔案中的內容,但鑒于SWIG沒有生成檔案,我不知道我是否遺漏了其他任何內容。我將嘗試撰寫自己的頭檔案以查看是否可以解決錯誤,但即使可以,那不應該是SWIG自動執行的操作嗎?
我的源檔案在下面
/** file: golibraw.i **/
%module librawgo
%{
#define LIBRAW_LIBRARY_BUILD
/* Put headers and other declarations here */
#include "libraw/libraw.h"
#include "libraw/libraw_alloc.h"
#include "libraw/libraw_const.h"
#include "libraw/libraw_datastream.h"
#include "libraw/libraw_internal.h"
#include "libraw/libraw_types.h"
#include "libraw/libraw_version.h"
%}
%include "libraw/libraw.h"
%include "libraw/libraw_alloc.h"
%include "libraw/libraw_const.h"
%include "libraw/libraw_datastream.h"
%include "libraw/libraw_internal.h"
%include "libraw/libraw_types.h"
%include "libraw/libraw_version.h"
cmake_minimum_required(VERSION 3.14)
if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
message( FATAL_ERROR "In-source builds not allowed. Please make a new directory and run CMake from there. You may need to remove CMakeCache.txt." )
endif()
find_package(SWIG 4.0 COMPONENTS python OPTIONAL_COMPONENTS go)
if(SWIG_FOUND)
message("SWIG found: ${SWIG_EXECUTABLE}")
include (UseSWIG)
if(NOT SWIG_go_FOUND)
message(FATAL_ERROR "SWIG go bindings cannot be generated")
endif()
else()
message(FATAL_ERROR "SWIG NOT FOUND")
endif()
set(PROJECT_NAME librawgo)
project(${PROJECT_NAME})
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY
${CMAKE_SOURCE_DIR}/librawgo
CACHE PATH
"Single Directory for all"
)
find_program( CLANG_TIDY NAMES clang-tidy)
set(${PROJECT_NAME}_sources ${CMAKE_SOURCE_DIR}/src/librawgo.i )
swig_add_library(${PROJECT_NAME} TYPE SHARED LANGUAGE go SOURCES ${${PROJECT_NAME}_sources})
if(CLANG_TIDY)
set_property(
TARGET ${PROJECT_NAME}
PROPERTY CXX_CLANG_TIDY "${CLANG_TIDY}")
endif()
set_property(TARGET ${PROJECT_NAME} PROPERTY SWIG_COMPILE_OPTIONS -go -intgosize 64 -cpperraswarn)
set_property(TARGET ${PROJECT_NAME} PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES TRUE)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR})
uj5u.com熱心網友回復:
原因是 Go 編譯器對庫一無所知librawgo.so。
將以下行放在C注釋的頂部librawgo.go:
#cgo LDFLAGS: -L<path/to/dir/with/librawgo.so> -lrawgo -lraw
該指令告訴編譯器將此行添加到聯結器標志。
抱歉,我不知道如何修改您的 CMake 和 SWIG 設定以自動生成此行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512022.html
標籤:C 去痛饮
