繁体   English   中英

如何在 SWIG 的帮助下在 Go 代码中使用 C++ 共享库?

[英]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);

我采取的步骤:

  1. 运行 swig 命令: swig -go -cgo -c++ -intgosize 64 -use-shlib -soname examplelib.so example.i
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM