我试图将现有的C ++库链接到代码。 C ++库只有一个静态库和一个头文件,没有源代码。
我使用swigc生成了libfoo.go,并编写了一个简单的libb.go来构建该库。这在较早的gcc-6的ubuntu 16.04上运行良好。
但是,一旦我升级到ubuntu 18,甚至使用旧的go1.9和gcc-6都可以正常工作,我就会遇到以下错误:
/usr/bin/ld: ./lib/libfoo.a(parser.o): relocation R_X86_64_32S against symbol `xmlSAX2IgnorableWhitespace' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: ./lib/libfoo.a(tree.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC
我将go编译器和gcc都降级到了以前可以使用的版本。
以下是用于工作的libb.go
/*
#cgo CXXFLAGS: -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0 -w
#cgo CFLAGS: -I${SRCDIR}/include -w
#cgo LDFLAGS: -Wl -rpath,./lib, -L${SRCDIR}/lib -l:libfoo.a -l:libxml2.a
*/
import "C"
该如何解决?我搜索了一下,看来我不得不重新编译该静态库,对于我而言,这是不可能的。我试图将-no-pie参数传递给LDFLAGS,但这也不起作用。
答案 0 :(得分:1)
这些天我也遇到了这个问题。最后,我发现在下面的行中添加
"env CGO_LDFLAGS=-no-pie"
去建立命令行可以解决这个问题。例如,
"env CGO_LDFLAGS=-no-pie go build -o main main.go"