我有一個共享庫被另一個應用程序超出了我的控制範圍,它需要* .so對象。我的庫使用sqlite3需要靜態鏈接它(我絕對需要一個自包含的二進制文件)。C++靜態鏈接共享庫
當我嘗試編譯和鏈接我的圖書館:
-fpic -flto -pthread -m64
-flto -static -shared
我結束了以下錯誤:
/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
什麼是重新編譯-fPIC有關?我的代碼或CRT?
我已經嘗試用-fPIC編譯我的對象,並得到相同的結果。
謝謝。
編輯:
似乎問題並不涉及到sqlite3的。
我寫了編譯和像這樣的鏈接一個簡單的線什麼都不做的庫:
g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
,但不喜歡這樣的:
g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
的問題似乎與CRT (crtbeginT.o)。我應該重新編譯GCC --with-pic或其他什麼?
這有點令人困惑。你是否試圖將你的庫鏈接到一個靜態的sqlite庫,或者你是否還想做其他的事情? – nos
PIC =共享庫所需的位置獨立代碼(在大多數體系結構上,我猜) – sehe
@nos試圖將我的共享庫鏈接到sqlite3.a – Petr