Я пытался связать существующую библиотеку C ++, чтобы перейти код.Библиотека C ++ имеет только статическую библиотеку и заголовочный файл, без исходного кода.
Я использовал swigc для генерации libfoo.go и написал простой libb.go для сборки этой библиотеки.Это хорошо работало на Ubuntu 16.04 с gcc-6 ранее.
Однако, как только я обновился до 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
У меня естьпонизил и компилятор, и 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, который тоже не работал.