在Linux動態庫Project中連結靜態庫時,遇到error adding symbols: Bad value的問題
現象:在生成某個動態庫比如SDS_Utility.so的時候,需要靜態連結某些庫,如libboost_log.a, 報上述錯誤。
原因:靜態庫想連結進動態庫,必須滿足一定的條件,靜態庫需要加-fPIC選項編譯,編譯成Position Independent Code(也就是可重定位的程式碼),否則就會報錯:error adding symbols: Bad value。
對這種靜態庫,有兩種處理方法:
(1)使用 -fPIC 選項重新編譯靜態庫。
(2)還有一種方式,就是在SDS_Utility.so中,不連結靜態庫。在使用SDS_Utility.so的bin(exe)程式中,連結該靜態庫。boost的靜態庫預設編譯,沒有加-fPIC選項,用該方法測試通過。
其他疑問:
(1)使用靜態連結開關-Wl,-Bstatic -Wl,-lboost_log -Wl,-Bdynamic,是否可以?
答案:不行。一樣報錯:error adding symbols: Bad value。因為該靜態庫的程式碼缺少PIC特性。
相關推薦
在Linux動態庫Project中連結靜態庫時,遇到error adding symbols: Bad value的問題
現象:在生成某個動態庫比如SDS_Utility.so的時候,需要靜態連結某些庫,如libboost_log.a, 報上述錯誤。 原因:靜態庫想連結進動態庫,必須滿足一定的條件,靜態庫需要加-fPIC選項編譯,編譯成Position Independent C
在Linux上git pull線上倉庫代碼時,出現error: Your local changes to the following files would be overwritten by merge
chan 導致 系統權限 over local tar erro 關閉 oca 在Windows上工作時未出現過該問題,於是通過命令: git diff 查看差異,得到結果: diff --git a/start_crons.sh b/start_crons.sh o
Linux下動態庫(.so)和靜態庫(.a) 的區別 Linux下動態庫(.so)和靜態庫(.a) 的區別 動態庫(.so)連結靜態庫(.a)的情況總結
Linux下動態庫(.so)和靜態庫(.a) 的區別 靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。編譯之後程式檔案大,但載入快,隔離性也好。 動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。多個
Linux中的靜態庫和動態庫簡介及生成過程示例
http://www.daxixiong.com/?/article/13 【文章摘要】在實際的軟體開發專案中,不是每一行程式碼都需要我們親自寫。在我們的軟體產品中,有一些程式碼(尤其是函式)的出現頻率很高,它們可以被當作公共程式碼來反覆使用。為了避免重複勞動,我們就把這些
HelloWorld CMake CMake中構建靜態庫與動態庫及其使用
繼續完善Hello World,建立它的共享庫, 包括靜態庫和動態庫。 本節的任務: 1,建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,HelloFunc 向終端輸出Hello World字串。 2,安裝標頭檔案與
CMake中構建靜態庫與動態庫及其使用(CMakeLists的一些解釋)
本節的任務: 1,建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,HelloFunc 向終端輸出Hello World字串。 2,安裝標頭檔案與共享庫。 3, 編寫一個程式使用建立的共享庫(靜態庫和動態庫)。 cd /home/ccj/
Qt5.7中使用MySQL Driver(需要把libmysql.dll檔案拷貝到Qt的bin目錄中。或者自己編譯的時候,連結靜態庫)
1、使用環境 Qt5.7的安裝安裝就已經帶了MySQL Driver,只需要在安裝的時候選擇一下即可。 如果沒有安裝,可以採取自己編譯的方式。 在Qt的原始碼包的qtbase\src\sql\drivers\mysql路徑下,就是相關的原始碼檔案。 這裡就不說編譯方式了。只
C語言中呼叫靜態庫函式和動態庫函式的方式
C語言中呼叫動態庫函式的兩種方式 方式一.隱式呼叫 將動態庫的相關檔案拷貝到當前目錄下(lib、dll),然後新增以下程式碼,在程式中指定連線庫函式。 注意:第二個引數給出的是引入庫檔案(或稱“匯出庫檔案”),而不是dll。在程式執行過程中,lib將dll中需要用到的函式對映到對應的記憶
Linux中的靜態庫、共享庫、標頭檔案及makefile檔案舉例
2、在bill.c檔案中引入標頭檔案,寫該函式的實現; ***@ubuntu:~/codeC/1201B$ more bill.c #include "bill.h" int bill(int a[], int n) { int i,max = a[i]; for( i = 0; i <
linux 連結 靜態庫 undefined reference to
最近將專案移植到linux上,工程需要依賴三個靜態庫:libprojcommon.a libluabind.a liblua.a 依賴關係是projcommon依賴luabind,luabind依賴lua,所以專案最終的連結引數是這樣的: -L/home/boy/ProjCommon/lib -lproj
gcc使用---動態庫連結靜態庫
00001f18 a _DYNAMIC 00001ff4 a _GLOBAL_OFFSET_TABLE_w _Jv_RegisterClasses 00001f08 d __CTOR_END__ 00001f04 d __CTOR_LIST__
動態庫、靜態庫編譯測試:含靜態庫連結動態庫、靜態庫,動態庫連結靜態庫、動態庫
本文的目的是測試各種型別庫的編譯後的使用效果,包括庫又連結其他庫的編譯方法,使用方法,依賴性等。 太長不看版:請跳至文章最後的總結對比表。 一。內容包含: ①靜態庫libbb.a依賴靜態庫libaa.a的測試; ②靜態庫libbb.a依賴動態庫libaa.so的測試;
Linux下gcc生成和使用靜態庫和動態庫詳解
一、基本概念 1.1什麼是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二
動態庫(.so)連結靜態庫(.a)的總結
動態庫(.so)連結靜態庫(.a)的情況總結 一般來說在連結時想要使用靜態庫有三種方法: 1、link時加上 -static 選項;當加上 -static選項後,gcc會把所有用到的庫都做靜態連線。 2、link時直接指定想要靜態連線的.a檔案的絕對路徑。優點是除非.a檔案不存在,否則肯定有效;缺點也是很
淺談GCC/Clang生成和連結靜態庫/動態庫
為了方便下面的講解,先寫兩個C++原始檔,程式碼如下: 1 2 3 4 5 //add.cpp int add(int a, int b) { return a + b; } 1 2 3 4 5 6 7 8 9 10 11 //main.cpp #in
【C/C++開發】強制連結靜態庫所有符號(包括未被使用的)
C++程式在連結一個靜態庫時,如果該靜態庫裡的某些方法沒有任何地方呼叫到,最終這些沒有被呼叫到的方法或變數將會被丟棄掉,不會被連結到目標程式中。這樣做大大減小生成二進位制檔案的體積。但是,某些時候,即使靜態庫裡的某些方法沒有任何地方使用到,我們也希望將這些沒有使用到的程式碼編譯進最終的二進位制檔案中
關於Cmake 連結靜態庫出現undefined reference to錯誤
在編寫一個C++專案的時候,使用cmake管理工程,成功連結一個靜態庫,但是在編譯時仍然出現undefined reference to 的錯誤。 最終發現問題是由於c和c++混編導致的。 解決方案: 由於我連結的庫是使用c語言編寫,所以需要在include標頭檔案時加上 #
CURL 連結靜態庫
一、 編譯屬於你的 CURL 下載最新版本 CURL : curl-7.54.0; 開啟你的 vs 等ide 的命令提示符視窗 編譯成功後: 在../Builds目錄下查詢 你要所需要的lib 庫 二、靜態連結庫使用: 當程式中使用 lib 庫進行編譯時候提
Android.mk 中的靜態庫和共享庫
有些類似的問題碰到過很多次,但大腦裡總是各種碎片化的記憶,長時間記住這些碎片並不是人類大腦的強項,所以有事沒事就要捋捋,知道前因後果才 能記憶深刻。 Android.mk Android.mk 只是GNU Makefile的一小部分,用來編譯modul
vc連結靜態庫的時候要注意的問題
1、VC編譯選項 多執行緒 (/MT) 多執行緒除錯 (/MTd) 多執行緒 DLL (/MD) 多執行緒除錯 DLL (/MDd) 2、C執行時庫 庫檔案 Single thread(static link) ML libc.lib Deb