我想在Go程序中使用C ++程序xmr-stak。经过一些研究,我选择SWIG来生成绑定。问题是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"
由于Sw支持Swig,它将在构建时自动生成绑定。但是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 . && make
构建xmr-stak获得的,并且应该包含我需要的所有内容(现在)。
我的问题是这实际上不起作用。我得到以下输出:
$ 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
我在这里做错了吗?
答案 0 :(得分:0)
这为我解决了这个问题:
// #cgo LDFLAGS: -L${SRCDIR} -lxmr-stak-backend
import "C"
好像我刚用错了。