最新在使用國產化平臺做qt應用開發時,總是遇到qtcreator內調試運行
找不到動態庫的問題,為什么會出現這種問題呢?明明編譯的時候能夠正常通過,運行或者調試的時候找不到相關的庫呢?先說結論,排除庫本身的問題,歸根結底,可能是我們的pro文件中,關于庫鏈接的方式,不能夠被qmake正常解析,或者使我們鏈接方式不規范,導致我們的庫依賴路徑無法正常添加到運行環境中(qtcreator 相關配置,正常情況下會把解析的依賴環境自動加入運行環境中),進而導致在點擊運行或者調試時無法找到相關庫。
比如說,我們可能為了方便添加相同前綴的庫文件,使用以下方式鏈接
LIBS += -lopencv_*.so
這種方式在某些情況下是能夠正常編譯的,但是如果該類型庫文件具有前后依賴關系,系統可能就報找不到XXXX庫。
其次,發現以下方式也肯能導致庫依賴路徑無法被加入運行環境
LIBS += /home/icpc/my/my.so
因此,自己總結了一下鏈接庫的方式,以opencv為例子,其庫包目錄如下
圖
include是包含目錄,lib是庫目錄。
在該庫包根目錄下,新建一個xxxx.pri文件,內容如下
#opencv 4.5.3 install path
OPENCV_INSTALL_PATH = $$PWD/../opencv4.5.3#opencv 4.5.3 lib path
OPENCV_LIBS_PATH = $$OPENCV_INSTALL_PATH/lib#opencv 4.5.3 include path
OPENCV_INCLUDE_PATH = $$OPENCV_INSTALL_PATH/includeLIBS += -L$$OPENCV_LIBS_PATH -lopencv_aruco \-lopencv_barcode \-lopencv_bgsegm \-lopencv_bioinspired \-lopencv_ccalib \-lopencv_dnn_objdetect \-lopencv_dnn_superres \-lopencv_dpm \-lopencv_face \-lopencv_freetype \-lopencv_fuzzy \-lopencv_hfs \-lopencv_img_hash \-lopencv_intensity_transform \-lopencv_line_descriptor \-lopencv_mcc -lopencv_quality \-lopencv_rapid \-lopencv_reg \-lopencv_rgbd \-lopencv_saliency \-lopencv_stereo \-lopencv_stitching \-lopencv_structured_light \-lopencv_phase_unwrapping \-lopencv_superres \-lopencv_optflow \-lopencv_surface_matching \-lopencv_tracking \-lopencv_highgui \-lopencv_datasets \-lopencv_text \-lopencv_plot \-lopencv_videostab \-lopencv_videoio \-lopencv_wechat_qrcode \-lopencv_xfeatures2d \-lopencv_shape \-lopencv_ml \-lopencv_ximgproc \-lopencv_video \-lopencv_dnn \-lopencv_xobjdetect \-lopencv_objdetect \-lopencv_calib3d \-lopencv_imgcodecs \-lopencv_features2d \-lopencv_flann \-lopencv_xphoto \-lopencv_photo \-lopencv_imgproc \-lopencv_coreINCLUDEPATH += $$OPENCV_INCLUDE_PATH/opencv4 \$$OPENCV_INCLUDE_PATH/opencv4/opencv2
在需要調用opencv庫的庫或則應用的pro文件中,通過以下片段鏈接庫
include(/path/youpath/opencv/xxxx.pri)
如果多個庫都需要用該庫,在相關庫pro中添加以上片段即可,這樣保證了鏈接庫的一致性,同一工程中的同一種庫鏈接的是不同路徑下的庫。
此時,完成編譯后,opencv相關的庫應該就正常添加到運行環境中了,在qtcreator中運行或調試程序時,就不會出現相關找不到庫的情況。
ps:部分庫之間是有前后依賴關系的,加載順序錯誤也有可能導致程序運行出錯,pkg_config鏈接方式較好,但也需要寫一下依賴路徑。