如何在SWIG的帮助下使用C++Go代码中的共享库?
How to use C++ shared library in Go code with the help of SWIG?
我有一个第三方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);
我采取的步骤:
- 运行 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
显示了它。
我在这里做错了什么?
我设法通过将额外的cgo编译标签添加到 SWIG 生成的 .go 文件中,最终将C++共享库链接到我的 Go 代码。这不是显而易见的事情,因为我认为SWIG在运行后不需要任何进一步的调整。
因此,解决此问题的两行代码是:
#cgo CFLAGS: -std=c99
#cgo LDFLAGS: -L. -l:examplelib.so
LDFLAGS说在当前路径中查找库"examplelib.so"。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 如何在SWIG的帮助下使用C++Go代码中的共享库?
- Google App Engine 会在实例休眠后缓存编译的 go 代码吗?