2017-03-14 28 views
2

我試圖在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 documentationgo build將調用痛飲與c++選項與.swigcxx擴展名的文件,但go build抱怨說,有目錄中沒有的可建圍棋源文件。

  • 平臺:達爾文
  • 轉到版本:1.8
  • 痛飲版本:3.0.12
  • 鐺版本:8.0.0

下面是我要到達的步驟錯誤:

  1. 克隆labstreaminglayer回購。
  2. 將文件liblsl_cpp.i重命名爲liblsl.swigcxx(我認爲這會告訴go build該文件應與swig一起使用)。
  3. 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 

回答

1

我幾個月前就遇到了這個,需要較長的時間來找出比我所希望的,但我不記得正是我所做的修復它,但我認爲它是沿着這些線:

  1. 不要手動調用swig,它實際上使事情變得更加困難。清理由swig生成的文件。
  2. 創建libsl - 通用文件a.go與內容:

    package libsls-Generic 
    
  3. 理論上你有一些其他的文件,說app.go將使用libsls-Generic。適當地寫入app.goimport libsls-Generic
  4. 使用go build app.go。這也應該建立依賴關係。

我終於想出如何讓go合併swig手動生成的文件,但我現在忘記了細節。我記得當用swig手動生成文件時,我將不得不在手動重建時手動刪除某些文件。在剛剛開始運行時,構建步驟要簡單得多。

+0

謝謝,這清除了如何使用'go build''沒有'swig'。然而,當我使用'swig':'linker命令失敗'時(和許多符號未找到),我得到了類似的錯誤。鏈接器找不到「LSL/liblsl/bin/liblsl.dylib」。我試着運行'go build -ldflags「-L ../liblsl/bin -l lsl」app.go',但得到了相同的鏈接器錯誤。 – Jakub

+1

您是否嘗試過指定dylib作爲cgo評論鏈接? http://stackoverflow.com/questions/16747021/how-do-you-statically-link-a-c-library-in-go-using-cgo – dragonx

+0

我做到了,它似乎工作!謝謝 – Jakub