我想在Go中包装C代码(
LabStreamingLayer).
更新:@dragonx解释了如何在没有swig的情况下使用go build.但我仍然遇到链接器问题.构建依赖于LSL / liblsl / bin / liblsl.dylib.如何告诉go build使用该文件?我试着去构建-ldflags“-L ../liblsl/bin -l lsl”app.go但没有成功.
Go documentation表示go build将使用带有.swigcxx扩展名的文件的c选项调用Swig,但是go build会抱怨目录中没有可构建的Go源文件.
>平台:达尔文
>去版:1.8
> Swig版本:3.0.12
> clang版本:8.0.0
以下是我为达到该错误而采取的步骤:
>克隆labstreaminglayer repo.
>将文件liblsl_cpp.i
重命名为liblsl.swigcxx(我认为这将告诉构建该文件应该与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,它实际上使事情变得更加困难.清理swig生成的文件.
>在libsl-Generic中创建一个文件a.go,内容如下:
package libsls-Generic
>理论上你有一些其他的文件,比如app.go将使用libsls-Generic.写app.go并适当地导入libsls-Generic.
>使用go build app.go.这也应该构建依赖关系.
我最终想出如何开始合并swig手动生成的文件,但我现在忘记了细节.我记得在使用swig手动生成文件时,我必须在重建时手动删除某些文件.当刚刚运行时,构建步骤要简单得多.