gpt4 book ai didi

c++ - 用 Go 构建包装 C++

转载 作者:IT王子 更新时间:2023-10-29 01:09:11 26 4
gpt4 key购买 nike

我正在尝试在 Go 中包装 C++ 代码 ( LabStreamingLayer)。

更新:@dragonx 解释了如何在没有swig 的情况下使用go build。但我仍然遇到链接器问题。构建依赖于 LSL/libsl/bin/liblsl.dylib。我如何告诉 go build 使用该文件?我尝试了 go build -ldflags "-L ../liblsl/bin -l lsl"app.go 但没有成功。

Go documentation表示 go build 将为具有 .swigcxx 扩展名的文件调用带有 c++ 选项的 Swig,但是 go build提示目录中没有可构建的 Go 源文件。

  • 平台: Darwin
  • Go 版本:1.8
  • Swig 版本:3.0.12
  • clang 版本:8.0.0

以下是我为解决该错误所采取的步骤:

  1. 克隆 labstreaminglayer 存储库。
  2. 重命名文件 liblsl_cpp.ilibsl.swigcxx(我认为这会告诉 go build 该文件应该与 swig 一起使用)。
  3. cd 进入 LSL/libsl-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

最佳答案

几个月前我遇到了这个问题,花了比我希望的更长的时间来弄清楚,但我不记得我做了什么来修复它,但我认为是沿着这些思路:

  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。这也应该建立依赖关系。

我最终想出了如何让 go 合并 swig 手动生成的文件,但我现在忘记了细节。我记得当用 swig 手动生成文件时,我必须在重建时手动删除某些文件。使用 just go 运行时,构建步骤要简单得多。

关于c++ - 用 Go 构建包装 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42794318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com