用Go构建包装C.

我想在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手动生成文件时,我必须在重建时手动删除某些文件.当刚刚运行时,构建步骤要简单得多.

点赞