I am trying to wrap C++ code (LabStreamingLayer) in Go.
Update: @dragonx explained how to use go build
without swig
. But I am still running into a linker issue. The build depends on LSL/liblsl/bin/liblsl.dylib
. How do I tell go build
to use that file? I tried go build -ldflags "-L ../liblsl/bin -l lsl" app.go
with no success.
The Go documentation says that go build
will invoke Swig with the c++
option for files with the .swigcxx
extension, but go build
complains that there are no buildable Go source files in the directory.
- Platform: Darwin
- Go version: 1.8
- Swig version: 3.0.12
- clang version: 8.0.0
Here are the steps I took to arrive at that error:
- Clone the labstreaminglayer repo.
- Rename the file
liblsl_cpp.i
toliblsl.swigcxx
(I thought this would tellgo build
that the file should be used with swig). -
cd
intoLSL/liblsl-Generic
and rungo build
. Go complains that there are no buildable Go source files in this directory.
After that failed, I tried using Swig. I ran swig -c++ -go -cgo -intgosize 64 liblsl_cpp.i
, which created a .go
file. I then ran go build
in that directory, but it raised the error:
- ld: symbol(s) not found for architecture x86_64
- clang: error: linker command failed with exit code 1
I am not familiar with C++, so I am not sure how to resolve the linker issue. I do know that this C++ code requires the file LSL/liblsl/bin/liblsl64.dylib
. I assume that is the file that must be linked?
How can I wrap this C++ code in Go?
Here is the file structure:
- 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