導航:首頁 > 源碼編譯 > 編譯需要不同版本的lib

編譯需要不同版本的lib

發布時間:2024-01-17 21:21:23

① 高版本gcc編譯出的程序在低版本glibc機器上運行

比如我們用gcc 9.3.0編譯程序,但需要發布的機器gcc版本是4.8.5,怎麼辦?

你可能想到如下方法

將libc和libstdc++靜態編譯,編譯時帶上如下參數。

glibc並不推薦靜態鏈接,你依賴的其他庫可能依賴的了glibc,並且往往是動態鏈接的,可以通過 nm <bin> | grep GLIBC_ 確定你的程序是否依賴了glibc。

使用攜帶gcc9.3.0環境的容器發布程序,是可以的。但是在一些沒有容器且沒有sudo許可權的場合,依然不太友好。

這個方法雖然聽起來不是很優雅,但其實如果你對elf文件有一些了解,是不錯的方式。下面說下具體的方法。

當你有條件獲得程序源碼,並能夠重新編譯時,可以直接在編譯時指定相關參數來解決。
先說編譯時要增加的參數:

gcc參數

ld參數

這兩個參數分別設置的elf文件中的rpath和interpreter欄位。

rpath
全名 run-time search path ,是elf文件中一個欄位,它指定了可執行文件執行時搜索so文件的第一優先位置,一般編譯器默認將該欄位設為空。elf文件中還有一個類似的欄位runpath,其作用與rpath類似,但搜索優先順序稍低。搜索優先順序:

如果你需要使用相對路徑指定lib文件夾,可以使用 ORIGIN 變數,ld會將ORIGIN理解成可執行文件所在的路徑。

interpreter
動態庫載入器,程序啟動時,操作系統會先把控制權轉交給ld-linux-x86-64.so.2,該so負責載入所有程序依賴的so。。這個欄位在鏈接時會幫你自動設置,64bit程序一般為 /lib64/ld-linux-x86-64.so.2 。修改rpath或者LD_LIBRARY_PATH指向本地lib目錄,但通過ldd程序,發現/lib64/ld-linux-x86-64.so.2這個so仍然指向系統so。原因就是這個欄位是寫死在elf文件中的,並不受LD_LIBRARY_PATH影響。

編譯時帶上這兩個參數,下面只需要將你程序依賴的so打包一份,隨程序進行發布即可。

當你無法編譯程序時,也可以通過其他方式修改rpath和interpreter。這種情況需要使用到一個工具 patchelf ,通過 dnf install patchelf 即可安裝。你可以通過它修改elf文件的rpath和interpreter:

除了絕對路徑,一種比較常見的方式是在部署前,使用 pwd 獲取當前路徑,使用相對路徑指向本地lib。

② 怎樣在visual studio opencv中編譯

1、設置VC++目錄,
可執行目錄 C:\opencv\build\x86\vc10\bin
包含目錄 C:\opencv\include;C:\opencv\build\include;C:\opencv\build\include\opencv2;C:\opencv\build\include\opencv
庫目錄 C:\opencv\build\x86\vc10\staticlib
2、鏈接器 輸入 添加staticlib下的所有release版本lib
asmlibrary.lib
IlmImf.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
zlib.lib
opencv_calib3d244.lib
opencv_contrib244.lib
opencv_core244.lib
opencv_features2d244.lib
opencv_flann244.lib
opencv_gpu244.lib
opencv_highgui244.lib
opencv_imgproc244.lib
opencv_legacy244.lib
opencv_ml244.lib
opencv_nonfree244.lib
opencv_objdetect244.lib
opencv_photo244.lib
opencv_stitching244.lib
opencv_ts244.lib
opencv_video244.lib
opencv_videostab244.lib
二、去掉重復引入
常規 在靜態庫中使用 MFC
C/C++ 代碼生成 使用MT
三、找不到AVIInputFile符合
C盤搜索VFW32.lib,添加到項目

③ lib文件是什麼是不是編譯自動生成我不加lib文件運行不了

lib文件是靜態庫,這種文件中有頭文件中聲明的函數的實現代碼,一般用在靜態連編上,編譯鏈接時,將lib文件與其他模塊編譯生成的目標代碼鏈接,從而形成能夠運行的可執行文件。
#pragma comment(lib, "pcc32_vc6.lib")就是連入一個庫文件,表示鏈接pcc32_vc6.lib這個靜態庫文件來生成可執行文件。

④ 編譯安裝python需要哪些依賴

依賴庫:

//使用apt 安裝即可
1.gcc, make, zlib1g-dev(壓縮解壓縮庫)
安裝過程需要的庫。
2.libbz2-dev
bz2支持庫,若在編譯安裝python前沒有安裝,將無法通過pip install 安裝提供bz2格式的第三方庫,會出現unsupported archive format: .tar.bz2的錯誤,例如爬蟲庫Scrapy依賴的Twisted。
3.libsqlite3-dev
sqlite3支持庫,若在編譯安裝python前沒有安裝,則python中會缺失sqlite3模塊,當引入sqlite3或使用依賴sqllite3的第三方庫(例如Scrapy)時,會出現ImportError: No mol named _sqllite3的錯誤。
//以上為編譯安裝前需要安裝的庫,可能不夠全面,會不斷補充。
4.其他:安裝第三方庫需要的庫
python3-dev, libxml2-dev, libxslt1, libffi-dev, libssl-dev等,在安裝第三方庫會有具體說明,不做過多解釋。

安裝:

//通過wget獲取壓縮包,這里選擇3.6.1版
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
//解壓
tar xJf Python-3.6.1.tar.xz
cd Python-3.6.1
./configure
make
/*這步如果需要sudo,請使用sudo -H命令,即sudo -H make install,避免pip等模塊安裝失敗。
錯誤示例(pip安裝失敗):The directory '/home/ls/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
*/
make install

⑤ 關於gcc編譯選項選取動態庫不同版本的問題

不同版本的動態庫是為了升級方便,舊的程序需要與舊的庫鏈接,新的程序與新的.

一般的做法是把libabc.so連接(symbolic link, ln -s libabc.so.N libabc.so)到最新的版本,這樣以後的新程序,在用gcc -labc的時候,都會鏈接到新的版本.舊的已經鏈接好的程序並不會產生不兼容的問題,因為舊程序在過去已經鏈接過了(動態庫鏈接的信息可以用ldd來查看: ldd /bin/ls).

symbolic link, ln是推薦的維護版本的辦法,不建議更改文件名.

如果你要有一個方便的辦法鏈接舊的版本, 建一個舊的版本的symbolic link就可以了,libabc11.so
ln -s libabc.so.11 libabc11.so
gcc -labc11...

閱讀全文

與編譯需要不同版本的lib相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:421
個人所得稅java 瀏覽:761
多餘的伺服器滑道還有什麼用 瀏覽:191
pdf劈開合並 瀏覽:28
不能修改的pdf 瀏覽:752
同城公眾源碼 瀏覽:489
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:79
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491