我正在尝试在Go中包装C++代码(LabStreamingLayer)。
更新:@dragonx解释了如何使用
我不熟悉C ++,所以不确定如何解决链接器问题。我知道这个C ++代码需要文件
我如何在Go中包装这个C ++代码?
这是文件结构:
更新:@dragonx解释了如何使用
go build
而不使用swig
。但是我仍然遇到链接器问题。构建依赖于LSL/liblsl/bin/liblsl.dylib
。我该如何告诉go build
使用那个文件?我尝试了go build -ldflags“-L ../liblsl/bin -l lsl”app.go
,但没有成功。
Go文档说,对于具有.swigcxx
扩展名的文件,go build
将使用c++
选项调用Swig,但是go build
抱怨在目录中没有可构建的Go源文件。
- 平台: Darwin
- Go 版本: 1.8
- Swig 版本: 3.0.12
- clang 版本: 8.0.0
以下是我出现错误的步骤:
- 克隆labstreaminglayer repo。
- 将文件
liblsl_cpp.i
重命名为liblsl.swigcxx
(我认为这会告诉go build
该文件应与swig一起使用)。 cd
进入LSL/liblsl-Generic
并运行go build
。 Go抱怨此目录中没有可构建的Go源文件。
在尝试失败后,我尝试使用Swig。我运行了swig -c++ -go -cgo -intgosize 64 liblsl_cpp.i
,它创建了一个.go
文件。然后我在该目录中运行了go build
,但是它引发了错误:
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
我不熟悉C ++,所以不确定如何解决链接器问题。我知道这个C ++代码需要文件
LSL / liblsl / bin / liblsl64.dylib
。我认为这就是必须链接的文件?我如何在Go中包装这个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
swig
的情况下使用go build
。但是,我遇到了与使用swig
时相似的错误:链接器命令失败
(并且找不到许多符号)。链接器无法找到LSL/liblsl/bin/liblsl.dylib
。我尝试运行go build -ldflags "-L ../liblsl/bin -l lsl" app.go
,但得到了相同的链接器错误。 - jkr