我试图在Go中包装C ++代码(LabStreamingLayer)。
更新:@dragonx解释了如何在没有go build
的情况下使用swig
。但我仍然遇到链接器问题。构建取决于LSL/liblsl/bin/liblsl.dylib
。如何告诉go build
使用该文件?我试过go build -ldflags "-L ../liblsl/bin -l lsl" app.go
没有成功。
Go documentation表示go build
将使用c++
选项为.swigcxx
扩展go build
的文件调用Swig,但liblsl.swigcxx
抱怨没有可构建的文件转到目录中的源文件。
以下是我为达到该错误而采取的步骤:
liblsl_cpp.i
重命名为go build
(我认为这会告诉cd
该文件应该与swig一起使用。)LSL/liblsl-Generic
加入go build
并运行swig -c++ -go -cgo -intgosize 64 liblsl_cpp.i
。 Go抱怨此目录中没有可构建的Go源文件。在失败之后,我尝试使用Swig。我运行了.go
,它创建了一个go build
文件。然后我在该目录中运行ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
,但它引发了错误:
LSL/liblsl/bin/liblsl64.dylib
我不熟悉C ++,所以我不确定如何解决链接器问题。我知道这个C ++代码需要文件LSL
├── liblsl
│ ├── bin
│ ├── distros
│ ├── examples
│ ├── external
│ ├── include
│ ├── project
│ ├── src
│ └── testing
└── liblsl-Generic
├── AUTOGENERATE\ HOWTO.txt
├── examples
├── liblsl.swigcxx
├── liblsl_c.i
├── liblsl_cpp.i
├── liblsl_wrap.cxx # created by Swig
└── liblsl.go # created by Swig
。我假设那是必须链接的文件?
如何在Go中包装此C ++代码?
这是文件结构:
{{1}}
答案 0 :(得分:2)
在libsl-Generic中创建一个文件a.go,内容为:
package libsls-Generic
app.go
将使用libsls-Generic
。适当地写下app.go
和import libsls-Generic
。go build app.go
。这也应该构建依赖关系。我最终想出如何让go
合并swig手动生成的文件,但我现在忘记了细节。我记得在使用swig手动生成文件时,我必须在重建时手动删除某些文件。当只使用go运行时,构建步骤要简单得多。
答案 1 :(得分:0)
swig -go -c++ -cgo -intgosize 32 -package liblsl liblsl_cpp.i
// #cgo LDFLAGS: -Wl,-rpath,/usr/local/lib -llsl64
之后,添加/usr/local/lib
(假设liblsl64.dylib位于package liblsl
)go install
可以做到这一点,liblsl.a
将位于Go home dir的pkg
文件夹下,您将能够从Go程序中导入它。