gcc g 靜態動態庫 混鏈結

2021-09-07 08:15:32 字數 1619 閱讀 8118

我的環境: centos6 x64. gcc4.4.7

在使用gcc/g++ 編譯程式時我們希望指向一些庫是使用靜態的鏈結方式. 另外的一些是動態的方式.

我以boost 為例.

如果我們要使用靜態庫則是這樣的:

# g++ main.cpp -lpthread /usr/lib64/libboost_thread.a /usr/lib64/libboost_system.a

靜態庫直接寫路徑. 動態前面加-l  這樣也可以實現.

但有沒有更好的辦法呢. 有.

先參考個帖子:

根據老外這個帖子 照貓畫狗

g++   main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread -wl,-bdynamic

這樣就可以了.

再來看一下老外的這個例子:

g++ main.cpp  -wl,-bstatic -lz -lfoo -wl,-bdynamic -lbar -wl,--as-needed

will link zlib and libfoo as static, and libbar as dynamic . --as-needed will drop any unused dynamic library.

但是這個過程中我用了將近1天時間才搞定的.

因為我剛開始是這樣寫的:

g++   main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread

/usr/bin/ld: cannot find -lgcc_s

collect2: ld returned 1 exit status

於是我就按照這個提示搞. 意思就是 libgcc_s.so 沒找到. 於是 我就折騰這個. 明明它在.可是就是提示找不到這個錯誤.

搞了大半天就要放棄了..

我最後想是不是 要在後面加  -wl,-bdynamic   其它的庫才能預設動態鏈結.

試了一下果然..

我在後面加了這個就成功了.

g++   main.cpp -lrt -wl,-bstatic -lboost_system -lboost_thread -wl,-bdynamic  -wl,--as-needed

-wl,--as-needed 這個選項是可選的是 這個選項的意思是去除沒有使用的動態庫

還有乙個比較簡單的錯誤就是 :

thread.cpp:(.text+0x1a93): undefined reference to `clock_gettime'

thread.cpp:(.text+0x1b08): undefined reference to `clock_gettime'

thread.cpp:(.text+0x1b6f): undefined reference to `clock_gettime'

thread.cpp:(.text+0x1bd6): undefined reference to `clock_gettime'

thread.cpp:(.text+0x1c3d): undefined reference to `clock_gettime'

一般動態鏈結時不會出現這個錯.  是靜態鏈結時才出這個錯.

加上 -lrt 選項就好了.

gcc g 靜態動態庫 混鏈結

我的環境 centos6 x64.gcc4.4.7 在使用gcc g 編譯程式時我們希望指向一些庫是使用靜態的鏈結方式.另外的一些是動態的方式.我以boost 為例.如果我們要使用靜態庫則是這樣的 g main.cpp lpthread usr lib64 libboost thread.a usr...

gcc g 動態鏈結庫和靜態庫的鏈結順序

so檔案 動態庫 a檔案 靜態庫 exe檔案 可執行程式 linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關 經過自己寫的一些測試程式,大致了解了下gcc中鏈結順序問題,總結出以下幾點 1,動態庫中可以包含另乙個靜態庫,通過引數 l 把靜態庫lib a加入so檔案中,這樣so檔案中 就包含了...

gcc g 生成 使用動態庫 靜態庫

gcc shared my.c o libmy.so有時候會報錯提示加上 fpic flag position independent code,為了生成位置無關 用全域性偏移的方式,乙份動態庫即可給多份主程式使用,細節自己網上查吧 加上就行了。libmy.so檔案注意lib字首和.so字尾。動態庫...