我試圖在Go中包裝C++代碼(LabStreamingLayer)。使用Go包裝C++構建
更新:@dragonx解釋瞭如何在不使用swig
的情況下使用go build
。但我仍然遇到鏈接器問題。構建取決於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
抱怨說,有目錄中沒有的可建圍棋源文件。
- 平臺:達爾文
- 轉到版本:1.8
- 痛飲版本:3.0.12
- 鐺版本:8.0.0
下面是我要到達的步驟錯誤:
- 克隆labstreaminglayer回購。
- 將文件
liblsl_cpp.i
重命名爲liblsl.swigcxx
(我認爲這會告訴go build
該文件應與swig一起使用)。 cd
分成LSL/liblsl-Generic
並運行go build
。去抱怨這個目錄中沒有可建立的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
。我認爲這是必須鏈接的文件?
如何將這個C++代碼包裝到Go中?
這裏是文件結構:
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 build''沒有'swig'。然而,當我使用'swig':'linker命令失敗'時(和許多符號未找到),我得到了類似的錯誤。鏈接器找不到「LSL/liblsl/bin/liblsl.dylib」。我試着運行'go build -ldflags「-L ../liblsl/bin -l lsl」app.go',但得到了相同的鏈接器錯誤。 – Jakub
您是否嘗試過指定dylib作爲cgo評論鏈接? http://stackoverflow.com/questions/16747021/how-do-you-statically-link-a-c-library-in-go-using-cgo – dragonx
我做到了,它似乎工作!謝謝 – Jakub