0

例如,如果我在 opencv 中使用一个函数,我可以使用两种方法来指定库并链接它们。第一个,我可以使用find_package(OpenCV 3.3 REQUIRED) 它们,target_link_libraries( main ${OpenCV_LIBS})因为宏包含我们需要的所有库。第二个,我想在没有“.cmake”的情况下链接我的opencv,我需要给 CMakeLists.txt 一个link_directiories(/xxxx)并使用target_link_libraries(main opencv_core opencv_imgcodecs).

所以我的问题是如何在使用第二种方法时快速找出我应该链接哪个库。就像我在 opencv_core.so 中使用了一些函数一样,但实际上我通过在 opencv 中的许多库中尝试几次就知道了。

4

1 回答 1

0

除了阅读您的库文档之外,没有快速的方法可以做到这一点。在 OpenCV 中这很简单,文档指定了模块列表,那么您的经验法则应该是:每当#include <opencv2/MODULE_NAME.hpp>您链接到opencv_MODULE_NAME. 例如#include <opencv2/imgproc.hpp>,那么你应该链接到opencv_imgproc.

如果您事先没有此类信息,则可以在 Linux 机器上查看可用动态库中的符号:

for lib in `find LIB_PATH -name "*.so"`; do echo ${lib}; nm -D -C ${lib}; done

LIB_PATH您的库的安装位置在哪里,例如/usr/lib.

然后,您可以保存输出并搜索链接器在构建项目时报告的未定义符号。而不是"*.so"你可以有更多限制性libopencv*.so的模式,比如限制输出。

于 2021-11-23T17:59:27.463 回答