簡體   English   中英

golang gcc c++ 現有靜態庫在制作PIE對象時不能使用; 用 -fPIC 重新編譯

[英]golang gcc c++ existing static library can not be used when making a PIE object; recompile with -fPIC

我試圖鏈接一個現有的 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,這也不起作用。

這幾天我也遇到了這個問題。 最后,我發現添加以下幾行

"env CGO_LDFLAGS=-no-pie"

go build 命令行可以解決這個問題。 例如,

"env CGO_LDFLAGS=-no-pie go build -o main main.go"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM