[英]How to use C++ shared library in Go code with the help of SWIG?
我有一个第 3 方 C++.so 库,我想在我的Go 代码中使用它。 我可以使它与普通的 C/C++ 一起工作,但无法连接到 Go。
该库有一个大的 header 文件,我需要的 function 在其中声明如下(重命名为更简单的外观):
typedef unsigned long (*INTERFACE_EXAMPLE_FUNC)(int example_var);
#ifdef PC_STATIC_LIBS
extern "C" unsigned long Example_func(int example_var);
#endif //PC_STATIC_LIBS
(我认为链接 static 库更容易,所以我将 #define PC_STATIC_LIBS 放在标题顶部)
我花了很多时间试图在没有 SWIG 的情况下链接这个库,但是cgo不会解析 C++ header,给我大量的错误消息。 所以,我现在正在尝试使用 SWIG。 目前我的 swig 接口文件example.i如下所示:
%module example
%{
#include "libheader.h"
extern unsigned long Example_func(int example_var);
%}
extern unsigned long Example_func(int example_var);
我采取的步骤:
swig -go -cgo -c++ -intgosize 64 -use-shlib -soname examplelib.so example.i
go install
我得到的结果:
/usr/bin/ld: $WORK/b001/_x003.o: in function `_wrap_Example_func_examplelib_8c0447b5964daffe':
./examplelib_wrap.cxx:302: undefined reference to `Example_func'
collect2: error: ld returned 1 exit status
所有正在使用的文件都在同一个目录中。 我还有一个库的副本放在我的 /usr/local/lib 和ldconfig -p
显示它。
我在这里做错了什么?
通过向 SWIG 生成的.go 文件添加额外的cgo编译标签,我终于将 C++ 共享库链接到我的 Go 代码。 这不是显而易见的事情,因为我认为 SWIG 在运行后不需要任何进一步的调整。
所以解决这个问题的两行代码是:
#cgo CFLAGS: -std=c99
#cgo LDFLAGS: -L. -l:examplelib.so
LDFLAGS 说要在当前路径中查找库“examplelib.so”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.