【问题标题】:How to use C++ shared library in Go code with the help of SWIG?如何在 SWIG 的帮助下在 Go 代码中使用 C++ 共享库?
【发布时间】:2020-01-22 18:08:21
【问题描述】:

我有一个第三方 C++ .so 库,我想在我的 Go 代码中使用它。我可以让它与普通的 C/C++ 一起工作,但无法连接到 Go。

该库有一个大头文件,我需要的函数在其中声明如下(重命名为更简单的外观):

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

(我认为链接静态库更容易,所以我将#define PC_STATIC_LIBS 放在标题顶部)

我花了很多时间试图在没有 SWIG 的情况下链接这个库,但是 cgo 不会解析 C++ 标头,给我大量的错误消息。 所以,我现在正在尝试使用 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 显示了它。

我在这里做错了什么?

【问题讨论】:

    标签: c++ go swig libraries


    【解决方案1】:

    通过向 SWIG 生成的 .go 文件添加额外的 cgo 编译标记,我最终将 C++ 共享库链接到我的 Go 代码。这不是显而易见的事情,因为我认为 SWIG 在运行后不需要任何进一步的调整。

    所以解决问题的两行代码是:

    #cgo CFLAGS: -std=c99
    #cgo LDFLAGS: -L. -l:examplelib.so
    

    LDFLAGS 表示要在当前路径中查找库“examplelib.so”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 2011-10-17
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多