加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用Go构建包装C.

发布时间:2020-12-16 07:20:43 所属栏目:百科 来源:网络整理
导读:我想在Go中包装C代码( LabStreamingLayer). 更新:@dragonx解释了如何在没有swig的情况下使用go build.但我仍然遇到链接器问题.构建依赖于LSL / liblsl / bin / liblsl.dylib.如何告诉go build使用该文件?我试着去构建-ldflags“-L ../liblsl/bin -l lsl”a
我想在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手动生成文件时,我必须在重建时手动删除某些文件.当刚刚运行时,构建步骤要简单得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读