例如,如果我在opencv中使用一个函数,我可以使用两个方法来指定库并链接它们。首先,我可以使用find_package(OpenCV 3.3 REQUIRED)
和它们target_link_libraries( main ${OpenCV_LIBS})
,因为宏包含了我们需要的所有库。第二个,我想链接我的opencv没有"。cmake";我需要给CMakeLists.txt一个CCD_ 3并使用CCD_。
所以我的问题是,在使用第二种方法时,如何快速找到应该链接的库。就像我在opencv_core.so中使用了一些函数,但实际上我在opencv中的许多库中尝试了几次就知道了。
除了阅读库文档之外,没有什么快速的方法可以做到这一点。在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
。
然后,您可以保存输出并搜索链接器在构建项目时报告的未定义符号。您可以使用更严格的模式(如libopencv*.so
(来限制输出,而不是"*.so"
。