Re: building C++ wrapper for mabain lib with go1.13

88 views
Skip to first unread message
Message has been deleted

Mohamed Mahmoud

unread,
Mar 17, 2020, 12:37:09 PM3/17/20
to golang-nuts


On Tuesday, March 17, 2020 at 12:04:34 PM UTC-4, Mohamed Mahmoud wrote:
I have created swigcxx file , since swig now is natively integrated in go tools
I ran the following to build a test program that interact with the mabain wrapper go package to test the APIs

go 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 ?


I have added the changes and steps to build here https://github.com/msherif4/mabain/tree/gointerface/swig/golang
 


Thanks!!

Ian Lance Taylor

unread,
Mar 17, 2020, 4:17:27 PM3/17/20
to mmahmo...@gmail.com, golang-nuts
I don't see anything obviously wrong. Add -v to -ldflags to see
exactly how the external linker is being invoked. Make sure that
-lmabain appears at the right point in the link line.

Ian
Message has been deleted

Mohamed Mahmoud

unread,
Mar 17, 2020, 5:05:31 PM3/17/20
to golang-nuts


On Tuesday, March 17, 2020 at 5:01:43 PM UTC-4, Mohamed Mahmoud wrote:
I don't see anything obviously wrong.  Add -v to -ldflags to see 
exactly 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 ?
 Step 25/26 : RUN cd ${MABAIN_SRC}/; go install -x -i -ldflags '-w -extldflags "-lmabain" -v'

 ---> 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

Ian Lance Taylor

unread,
Mar 17, 2020, 10:01:01 PM3/17/20
to Mohamed Mahmoud, golang-nuts
It doesn't look like the -ldflags option is getting through to the linker. Try
go build "-ldflags=all=-w -extldflags=-lmabain -v"

Ian

Mohamed Mahmoud

unread,
Mar 18, 2020, 8:01:27 AM3/18/20
to golang-nuts

It doesn't look like the -ldflags option is getting through to the linker.  Try
    go build "-ldflags=all=-w -extldflags=-lmabain -v"

Ian

I tried the new format however it still can't link mabain lib and I get the same errors

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':

Mohamed Mahmoud

unread,
Mar 18, 2020, 8:18:08 AM3/18/20
to golang-nuts

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


Please see http://www.swig.org for reporting bugs and further information 

Ian Lance Taylor

unread,
Mar 18, 2020, 11:59:38 AM3/18/20
to Mohamed Mahmoud, golang-nuts
Oh, sorry, I see now that this is failing in the cgo step, not the link step.

Try adding this to your Go file:

// #cgo LDFLAGS: -lmabain
import "C"

Ian

Mohamed Mahmoud

unread,
Mar 18, 2020, 12:59:02 PM3/18/20
to golang-nuts

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

 )

 I thought we can use either SWIG or CGO but not both ?

Ian Lance Taylor

unread,
Mar 18, 2020, 2:55:39 PM3/18/20
to Mohamed Mahmoud, golang-nuts
You can use both. It's the only way to let the package define CFLAGS
and LDFLAGS that you want to use for SWIG.

But you can't put the import "C" in a _test.go file. It has to be in
a regular .go file.

Ian
Reply all
Reply to author
Forward
0 new messages