最近在項(xiàng)目中使用jpeg
叉寂,遇到一個(gè)這樣的運(yùn)行時(shí)問題:
image.png
跟了一下代碼中的頭文件,發(fā)現(xiàn)是代碼中使用的頭文件和系統(tǒng)中存在的庫(kù)文件版本不一致的問題绿聘。
總結(jié)一下踩坑的體會(huì):
- 首先在Linux下嗽上,最好使用
find package
去查找需要引用的庫(kù),這樣同時(shí)使用系統(tǒng)的庫(kù)文件以及頭文件熄攘,最不容易產(chǎn)生上述問題。 - 其次彼念,就是要搞清楚自己到底用的是哪一個(gè)頭文件挪圾、庫(kù)文件,這樣會(huì)方便排查逐沙。
Linux下頭文件的查找順序如下:
- 首先搜索當(dāng)前目錄 (只有當(dāng)頭文件以#include "headfile.h"的形式出現(xiàn)時(shí)哲思,才會(huì)搜索當(dāng)目錄)
- 搜索
-I
指定的目錄 - 查找gcc環(huán)境變量指定的路徑:
C_INCLUDE_PATH、CPLUS_INCLUDE_PATH吩案、OBJC_INCLUCDE_PATH
- 查找系統(tǒng)路徑
\usr\local\include
- 查找系統(tǒng)路徑
\usr\include
Linux下庫(kù)文件的查找順序如下:
各類
"R*PATH"
-L
選項(xiàng)LD_LIBRARY_PATH
\lib
\usr\lib
\etc\ld.so.cache
參考博客這里有一個(gè)查看可執(zhí)行文件
RPATH
的常用命令:
readelf -d ELFFile | grep "R*PATH"
cmake
中link_directories
命令棚赔,會(huì)將其中路徑,寫入可執(zhí)行文件。
關(guān)于動(dòng)態(tài)路依賴動(dòng)態(tài)庫(kù)的問題
GCC要求顯示鏈接:自從binutils 2.22版本以后靠益,如果你在程序中使用了你依賴的動(dòng)態(tài)庫(kù)所依賴的動(dòng)態(tài)庫(kù)中的函數(shù)時(shí)丧肴,你就必須顯式的指定你依賴的動(dòng)態(tài)庫(kù)所依賴的動(dòng)態(tài)庫(kù)。
參考博客