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

标签 c++ go swig

我正在尝试在 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/

相关文章:

XML Marshalling 无需 Root 即可生成 XML

c++ - 覆盖静态类函数的默认 SWIG 名称

c++ - 线程导致意外崩溃

c++ - QML 使用带参数的 C++ 函数

go - 如何理解core/types/block.go中的 'rlpHash'方法

amazon-web-services - 使用 Golang SDK 的 S3 对象不会过期

python - SWIG_NewPointerObj 的最后一个参数是什么意思?

php - 如何使用 SWIG 在 OS X 上编译 PHP 扩展

c++ - 插入跳表

c++ - MySQL, C++ - 以编程方式,MySQL Autoincrement 如何工作?