最新在使用国产化平台做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/include
LIBS += -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_core
INCLUDEPATH += $$OPENCV_INCLUDE_PATH/opencv4 \
$$OPENCV_INCLUDE_PATH/opencv4/opencv2
在需要调用opencv库的库或则应用的pro文件中,通过以下片段链接库
include(/path/youpath/opencv/xxxx.pri)
如果多个库都需要用该库,在相关库pro中添加以上片段即可,这样保证了链接库的一致性,避免了同一工程中的同一种库链接的是不同路径下的库。
此时,完成编译后,opencv相关的库应该就正常添加到运行环境中了,在qtcreator中运行或调试程序时,就不会出现相关找不到库的情况。
ps:部分库之间是有前后依赖关系的,加载顺序错误也有可能导致程序运行出错,pkg_config链接方式较好,但也需要写一下依赖路径。