【问题标题】:Linker can not find OpenCV libraries when using CMake使用 CMake 时链接器找不到 OpenCV 库
【发布时间】:2013-05-28 01:08:07
【问题描述】:

我在 /usr/local/lib 中安装了一份 OpenCV2.4.0

我的程序编译正确,但是当链接器被调用时,它给出了如下错误:

/home/zhouw/moos-ivp-zhouw/trunk/src/pATRTest/mst.cpp:661: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat const&)'
CMakeFiles/pATR.dir/mst.cpp.o:/home/zhouw/moos-ivp-zhouw/trunk/src/pATRTest/mst.cpp:675: more undefined references to `cv::_OutputArray::_OutputArray(cv::Mat const&)' 
collect2: ld returned 1 exit status
make[2]: *** [../bin/pATR] Error 1
make[1]: *** [src/pATRTest/CMakeFiles/pATR.dir/all] Error 2
make: *** [all] Error 2

奇怪的是我的程序大量使用 opencv,如果 CMake 找不到库,它应该抱怨更多未定义的引用而不是一些。

我尝试添加 LINK_DIRECTORIES("/usr/local/lib") 在我的 cmake 文件中,但它没有帮助。 在 /usr/local/lib 下还安装了另一个名为 POCO 的库。我的程序还链接到 POCO 库,但 CMake 似乎可以轻松找到它们。

如果我手动链接 -L/usr/local/lib,它将正确链接而不会出错。

CMakeLists.txt 看起来像这样

PROJECT(pATR)

#what files are needed?
SET(SRCS
spline.hpp
utils.hpp utils.cpp
mst.hpp mst.cpp
cluster.hpp cluster.cpp
target.hpp target.cpp
detector.hpp detector.cpp
classifier.hpp classifier.cpp
atr.hpp atr.cpp
MOOSAtr.h MOOSAtr.cpp
main.cpp
)

ADD_EXECUTABLE(pATR ${SRCS})

# indicate how to link
#LINK_DIRECTORIES("/usr/local/lib")
TARGET_LINK_LIBRARIES(pATR opencv_core opencv_highgui opencv_imgproc MOOS)

INSTALL(TARGETS
pATR
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)

知道发生了什么吗?非常感谢!

【问题讨论】:

标签: opencv cmake


【解决方案1】:

如果您有 CMake 2.8,我建议使用 find_package(OpenCV) 加载库。

http://docs.opencv.org/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html有一个例子

CMake 文件:

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

【讨论】:

  • 我在发布问题之前尝试使用 find_package(OpenCV REQUIRED),不知何故我没有将库链接为 ${OpenCV_LIBS},但仍然使用它们各自的名称,即 opencv_core opencv_highgui opencv_imgproc。谢谢,现在一切正常!
  • 今天发生了一件奇怪的事情。我将我的软件的整个目录树复制到另一台具有相同版本的所有内容和相同的 OpenCV 安装的 Linux 机器上。返回链接错误!
  • 我添加了 SET(OpenCV_LIBS opencv_core opencv_highgui opencv_imgproc) 让它这次工作。这意味着什么? find_package 没有正常工作?
  • 我想不出一个简单的解释来明确设置它会使其工作。也许对 CMake 有更多经验的人可以对此有所了解。
【解决方案2】:

你追求的是:

find_package(OPENCV COMPONENTS core imgproc highgui REQUIRED)

来自文档:

带有组件的包

有些库不是单体的,而是带有一个或多个依赖的 库或组件。一个值得注意的例子是 Qt 库, 它(除其他外)随组件 QtOpenGL 和 QtXml 一起提供。到 使用这两个组件,使用以下 find_package 命令:

find_package(Qt COMPONENTS QtOpenGL QtXml REQUIRED)

另外,有关更多信息,您可以查看以下链接。

https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/How-To-Find-Libraries

【讨论】:

    【解决方案3】:

    我不确定 CMake 找不到链接库是否有意义。 CMake 会找到您的依赖项并生成 Makefile,但它实际上并没有为您编译和链接。

    您的错误不是来自 CMake,对吗?它们来自制造。

    我总是手动链接这个

    g++ -o myopencvapp `pkg-config --cflags --libs opencv` myopencvapp.cpp`
    

    在调用 g++ 时。

    【讨论】:

    • 感谢您的回复!是的,手动链接有效。我只是认为 /usr/local/lib 是 cmake 查找库的默认目录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2015-10-03
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多