使用Go构建包装C ++

时间:2017-03-14 18:56:13

标签: c++ go swig

我试图在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抱怨没有可构建的文件转到目录中的源文件。

  • 平台:达尔文
  • Go version:1.8
  • Swig版本:3.0.12
  • clang version:8.0.0

以下是我为达到该错误而采取的步骤:

  1. 克隆labstreaminglayer repo。
  2. 将文件liblsl_cpp.i重命名为go build(我认为这会告诉cd该文件应该与swig一起使用。)
  3. LSL/liblsl-Generic加入go build并运行swig -c++ -go -cgo -intgosize 64 liblsl_cpp.i。 Go抱怨此目录中没有可构建的Go源文件。
  4. 在失败之后,我尝试使用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}}

2 个答案:

答案 0 :(得分:2)

几个月前我碰到了这个问题,花了很长时间才弄明白,但我不记得我到底做了什么修复它,但我认为这是按照以下方式进行的:

  1. 不要手动调用swig,实际上会让事情变得更加困难。清理swig生成的文件。
  2. 在libsl-Generic中创建一个文件a.go,内容为:

    package libsls-Generic
    
  3. 理论上你有一些其他文件,比如app.go将使用libsls-Generic。适当地写下app.goimport libsls-Generic
  4. 使用go build app.go。这也应该构建依赖关系。
  5. 我最终想出如何让go合并swig手动生成的文件,但我现在忘记了细节。我记得在使用swig手动生成文件时,我必须在重建时手动删除某些文件。当只使用go运行时,构建步骤要简单得多。

答案 1 :(得分:0)

  1. 解压liblsl释放tarball并将liblsl-Generic克隆到Go home目录下的文件夹中
  2. 修复liblsl_cpp.i,使其指向正确的头文件路径
  3. 运行swig -go -c++ -cgo -intgosize 32 -package liblsl liblsl_cpp.i
  4. 在您的liblsl.go中的下一个注释之前的上一行// #cgo LDFLAGS: -Wl,-rpath,/usr/local/lib -llsl64之后,添加/usr/local/lib(假设liblsl64.dylib位于package liblsl
  5. 运行go install

可以做到这一点,liblsl.a将位于Go home dir的pkg文件夹下,您将能够从Go程序中导入它。