c++ - 如何将 C++ 库与 CGO 和 Swig 链接起来?

标签 c++ go swig cgo

我想使用 C++ 程序 xmr-stak在我的 Go 程序中。经过一番研究,我选择了 SWIG生成绑定(bind)。问题是 ld 找不到库文件。我会一步步写下我所做的。

我在 src/miner/xmrstak/xmrstak.swigcxx 创建了这个文件以及 xmr-stak 的源代码:

 %module xmrstak
 %{
#include "xmrstak/net/jpsock.hpp"
#include "xmrstak/jconf.hpp"
#include "xmrstak/misc/executor.hpp"
 %}


%include "xmrstak/misc/executor.hpp"

由于 Go 支持 Swig,它会在构建时自动生成绑定(bind)。但是 Go 仍然需要一个包名,所以我刚刚创建了 package.go:

package xmrstak

现在,我可以构建这个项目,这会导致很多错误,例如:

/tmp/go-build176223381/gitlab.com/jgillich/autominer/miner/xmrstak/_obj/xmrstak_wrap.cxx.o: In function `executor::inst()':
./xmrstak/misc/executor.hpp:35: undefined reference to `executor::executor()'

要解决此问题,看来我需要告诉 ld 链接库。我已将以下内容添加到我的 package.go:

// #cgo LDFLAGS: -L${SRCDIR}/xmrstak/ -l${SRCDIR}/libxmr-stak-backend.a
import "C"

并将 libxmr-stak-backend.a 复制到同一文件夹中。该文件是通过使用 cmake 构建 xmr-stak 获得的。 && make 并且应该包括我需要的一切(现在)。

我的问题是这实际上不起作用。我得到以下输出:

$ go install
# gitlab.com/jgillich/autominer/miner/xmrstak
xmrstak/misc/executor.hpp:43: Warning 507: No Go typemap defined for ex_event &&
[further warnings ommitted]
# gitlab.com/jgillich/autominer/miner/xmrstak
/usr/bin/ld: cannot find -l/home/jgillich/go/src/gitlab.com/jgillich/autominer/miner/xmrstak/libxmr-stak-backend.a
collect2: error: ld returned 1 exit status

但是文件确实存在:

$ ls
libxmr-stak-backend.a  package.go  xmrstak  xmrstak.swigcxx

$ file /home/jgillich/go/src/gitlab.com/jgillich/autominer/miner/xmrstak/libxmr-stak-backend.a
/home/jgillich/go/src/gitlab.com/jgillich/autominer/miner/xmrstak/libxmr-stak-backend.a: current ar archive

我是不是做错了什么?

最佳答案

这为我解决了问题:

// #cgo LDFLAGS: -L${SRCDIR} -lxmr-stak-backend
import "C"

看来我只是用错了 ld。

关于c++ - 如何将 C++ 库与 CGO 和 Swig 链接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47896459/

相关文章:

c++ - arduino fio v3,GPS NMEA读取错误,疯狂输出

c++ - opencv mat与CImage之间的转换

c++ - 解码无符号短值的函数

rest - 在使用 Auth0 的 golang 服务器中找出当前用户名

python - 是否存在 UCL 的 Python 实现或接口(interface)?

python - 使用 SWIG 将 C++ 文件包装为 Python 文件

c++ - 为什么 c/c++ 允许在函数调用中省略多维数组的最左边索引?

go - golang rpc找不到服务

go - 基于 mgo 中的正则表达式的搜索未给出所需的结果

c# - 如何从 C++ 为 Xamarin.Android 创建 C# DLL