I have created swigcxx file , since swig now is natively integrated in go toolsI ran the following to build a test program that interact with the mabain wrapper go package to test the APIsgo install -x -i -ldflags '-w -extldflags "-lmabain"'
However I ran into linker errors that I am not able to resolve
# mabain
/tmp/go-build378478658/b001/_x003.o: In function `mbOpen':
./mabain_c_interface.cpp:10: undefined reference to `mabain::CONSTS::ReaderOptions()'
./mabain_c_interface.cpp:12: undefined reference to `mabain::DB::DB(char const*, int, unsigned long, unsigned long, unsigned int)'
./mabain_c_interface.cpp:13: undefined reference to `mabain::DB::is_open() const'
./mabain_c_interface.cpp:14: undefined reference to `mabain::DB::StatusStr() const'
./mabain_c_interface.cpp:11: undefined reference to `mabain::CONSTS::WriterOptions()'
/tmp/go-build378478658/b001/_x003.o: In function `mbFind':
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::MBData()'
./mabain_c_interface.cpp:45: undefined reference to `mabain::DB::Find(char const*, int, mabain::MBData&) const'
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::~MBData()'
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::~MBData()'
/tmp/go-build378478658/b001/_x003.o: In function `mbClose':
./mabain_c_interface.cpp:23: undefined reference to `mabain::DB::Close()'
/tmp/go-build378478658/b001/_x003.o: In function `mbAdd':
./mabain_c_interface.cpp:30: undefined reference to `mabain::DB::Add(char const*, int, char const*, int, bool)'
/tmp/go-build378478658/b001/_x003.o: In function `mbRemove':
./mabain_c_interface.cpp:37: undefined reference to `mabain::DB::Remove(char const*, int)'
collect2: error: ld returned 1 exit status
root@e75d907ebd87:/usr/local/lib# ls -ltr
total 1844
-rwxr-xr-x 1 root root 1887608 Mar 17 11:42 libmabain.so
root@e75d907ebd87:/usr/local/lib#
root@e75d907ebd87:/usr/local/lib# objdump -t libmabain.so | grep ReaderOption
0000000000022b60 g F .text 0000000000000003 _ZN6mabain6CONSTS13ReaderOptionsEv
Any suggestions on how to fix this linker error ?
Thanks!!
I don't see anything obviously wrong. Add -v to -ldflags to seeexactly how the external linker is being invoked. Make sure that
-lmabain appears at the right point in the link line.
Ian
I added -v its not showing libmabain , I am not sure what exactly you mean by having -lmabain at the right point , below is my command line let me know what it should be ?
---> Running in fd8ed360602a
WORK=/tmp/go-build682038651
mkdir -p $WORK/b001/
swig -version
cd $WORK
/usr/local/go/pkg/tool/linux_amd64/compile -o ./b001/_go_.o -trimpath "$WORK/b001=>" -p main -complete -goversion go1.13 -D _$WORK -c=4 ./swig_intsize.go
cd /mabain_src
swig -go -cgo -intgosize 64 -module mabain -o $WORK/b001/mabain_wrap.cxx -outdir $WORK/b001/ -c++ mabain.swigcxx
CGO_LDFLAGS='"-g" "-O2"' /usr/local/go/pkg/tool/linux_amd64/cgo -objdir $WORK/b001/ -importpath _/mabain_src -- -I $WORK/b001/ -g -O2 $WORK/b001/_mabain_swig.go
cd $WORK
gcc -fno-caret-diagnostics -c -x c - -o /dev/null || true
gcc -Qunused-arguments -c -x c - -o /dev/null || true
gcc -fdebug-prefix-map=a=b -c -x c - -o /dev/null || true
gcc -gno-record-gcc-switches -c -x c - -o /dev/null || true
cd $WORK/b001
TERM='dumb' gcc -I /mabain_src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x001.o -c _cgo_export.c
TERM='dumb' gcc -I /mabain_src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x002.o -c _mabain_swig.cgo2.c
cd $WORK
g++ -fno-caret-diagnostics -c -x c - -o /dev/null || true
g++ -Qunused-arguments -c -x c - -o /dev/null || true
g++ -fdebug-prefix-map=a=b -c -x c - -o /dev/null || true
g++ -gno-record-gcc-switches -c -x c - -o /dev/null || true
cd /mabain_src
TERM='dumb' g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I $WORK/b001/ -g -O2 -o $WORK/b001/_x003.o -c mabain_c_interface.cpp
cd $WORK/b001
TERM='dumb' g++ -I /mabain_src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_x004.o -c mabain_wrap.cxx
TERM='dumb' gcc -I /mabain_src -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -I ./ -g -O2 -o ./_cgo_main.o -c _cgo_main.c
cd /mabain_src
TERM='dumb' g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=$WORK/b001=/tmp/go-build -gno-record-gcc-switches -o $WORK/b001/_cgo_.o $WORK/b001/_cgo_main.o $WORK/b001/_x001.o $WORK/b001/_x002.o $WORK/b001/_x003.o $WORK/b001/_x004.o -g -O2
# _/mabain_src
/tmp/go-build682038651/b001/_x003.o: In function `mbOpen':
./mabain_c_interface.cpp:10: undefined reference to `mabain::CONSTS::ReaderOptions()'
./mabain_c_interface.cpp:12: undefined reference to `mabain::DB::DB(char const*, int, unsigned long, unsigned long, unsigned int)'
./mabain_c_interface.cpp:13: undefined reference to `mabain::DB::is_open() const'
./mabain_c_interface.cpp:14: undefined reference to `mabain::DB::StatusStr() const'
./mabain_c_interface.cpp:11: undefined reference to `mabain::CONSTS::WriterOptions()'
/tmp/go-build682038651/b001/_x003.o: In function `mbFind':
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::MBData()'
./mabain_c_interface.cpp:45: undefined reference to `mabain::DB::Find(char const*, int, mabain::MBData&) const'
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::~MBData()'
./mabain_c_interface.cpp:44: undefined reference to `mabain::MBData::~MBData()'
/tmp/go-build682038651/b001/_x003.o: In function `mbClose':
./mabain_c_interface.cpp:23: undefined reference to `mabain::DB::Close()'
/tmp/go-build682038651/b001/_x003.o: In function `mbAdd':
./mabain_c_interface.cpp:30: undefined reference to `mabain::DB::Add(char const*, int, char const*, int, bool)'
/tmp/go-build682038651/b001/_x003.o: In function `mbRemove':
./mabain_c_interface.cpp:37: undefined reference to `mabain::DB::Remove(char const*, int)'
collect2: error: ld returned 1 exit status
The command '/bin/sh -c cd ${MABAIN_SRC}/; go install -x -i -ldflags '-w -extldflags "-lmabain" -v'' returned a non-zero code: 2
It doesn't look like the -ldflags option is getting through to the linker. Try
go build "-ldflags=all=-w -extldflags=-lmabain -v"
Ian
Step 25/26 : RUN cd ${MABAIN_SRC}/; go build -x -i "-ldflags=all=-w -extldflags=-lmabain -v"
---> Running in 90e992e27f6b
WORK=/tmp/go-build678792509
/tmp/go-build678792509/b001/_x003.o: In function `mbOpen':
root@70c73d4a4f01:/# go version
go version go1.13 linux/amd64
root@70c73d4a4f01:/# swig -version
SWIG Version 3.0.12
Compiled with g++ [x86_64-pc-linux-gnu]
Configured options: +pcre
Step 25/26 : RUN cd ${MABAIN_SRC}/; go build -x "-ldflags=all=-w -extldflags=-lmabain -v"
---> Running in e570e7fe65fa
WORK=/tmp/go-build247647361
can't load package: package .: use of cgo in test /mabain_src/mabain_test.go not supported
The command '/bin/sh -c cd ${MABAIN_SRC}/; go build -x "-ldflags=all=-w -extldflags=-lmabain -v"' returned a non-zero code: 1
MMAHMOUD-M-45WX:golang mohamedmahmoud$ git diff mabain_test.go
diff --git a/swig/golang/mabain_test.go b/swig/golang/mabain_test.go
index 3b5be36..d2bc605 100644
--- a/swig/golang/mabain_test.go
+++ b/swig/golang/mabain_test.go
@@ -1,14 +1,16 @@
package mabain
+// #cgo LDFLAGS: -lmabain
import (
+ "C"
"fmt"
- "testing"
"os"
+ "testing"
)
const (
MABAIN_PATH = "/var/tmp/mabain_test"
- COUNT = 100
+ COUNT = 100
)