如何借助 SWIG 在 Go 代码中使用 C++ 共享库?
How to use C++ shared library in Go code with the help of SWIG?
我有一个 第三方 C++ .so 库,我想在我的 Go 代码 中使用它。我可以让它与普通 C/C++ 一起工作,但无法连接到 Go。
该库有一个很大的 header 文件,我需要的函数在其中声明如下(为了更简单的外观而重命名):
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
(我认为 link 静态库更容易,所以我将 #define PC_STATIC_LIBS 放在 header 之上)
我花了很多时间尝试 link 这个没有 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 命令:
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 编译标签,最终 link 将 C++ 共享库添加到我的 Go 代码中。这不是显而易见的事情,因为我认为 SWIG 在 运行 之后不需要任何进一步的调整。
所以解决问题的两行代码是:
#cgo CFLAGS: -std=c99
#cgo LDFLAGS: -L. -l:examplelib.so
LDFLAGS 表示在当前路径中查找库 'examplelib.so'。
我有一个 第三方 C++ .so 库,我想在我的 Go 代码 中使用它。我可以让它与普通 C/C++ 一起工作,但无法连接到 Go。
该库有一个很大的 header 文件,我需要的函数在其中声明如下(为了更简单的外观而重命名):
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
(我认为 link 静态库更容易,所以我将 #define PC_STATIC_LIBS 放在 header 之上)
我花了很多时间尝试 link 这个没有 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 命令:
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 编译标签,最终 link 将 C++ 共享库添加到我的 Go 代码中。这不是显而易见的事情,因为我认为 SWIG 在 运行 之后不需要任何进一步的调整。
所以解决问题的两行代码是:
#cgo CFLAGS: -std=c99
#cgo LDFLAGS: -L. -l:examplelib.so
LDFLAGS 表示在当前路径中查找库 'examplelib.so'。