OpenCV:使用 cmake 时对 `cv::imread 的未定义引用

OpenCV: undefined reference to `cv::imread when using cmake

我必须在两个系统上使用 OpenCV,都 Linux。我的设置适用于第一个系统,但在第二个系统上失败。对于这两个系统,我都使用以下方法在自定义位置安装了 OpenCV:

cd myBuildDir
cmake -DWITH_VTK=OFF -DCMAKE_BUILD_TYPE=Release 
  -DCMAKE_INSTALL_PREFIX=~/Software/OpenCVLibs/opencv-3.1.0/release 
  ~/Software/opencv-3.1.0 
make && make install

和类似的调试。目录不同。一个是我的用户在我的笔记本电脑上,另一个是另一个用户在多用户系统上。

然后我使用 OpenCV 文档中给出的示例来测试我的设置: http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html

使用我使用的自定义 OpenCV 位置构建示例

cmake -DCMAKE_BUILD_TYPE=Release -DOpenCV_DIR=~/Software/OpenCVLibs
  /opencv-3.1.0/release/share/OpenCV exampleSourceDir

这适用于第一个系统(gcc 版本 5.3.0),但在第二个系统(gcc 版本 4.6.3)上失败。不要认为 gcc 版本在这里很重要,但为了完整性而声明它们。我认为这可能与在第一个系统上安装的系统路径中没有 OpenCV,而在第二个系统中有。但是构建失败:

/usr/bin/cmake -E cmake_link_script CMakeFiles/DisplayImage.dir/link.txt --verbose=1
/usr/bin/c++   -O3 -DNDEBUG    CMakeFiles/DisplayImage.dir/DisplayImage.cpp.o  -o DisplayImage -rdynamic /home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_videostab.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_videoio.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_video.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_superres.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_stitching.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_shape.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_photo.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_objdetect.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_ml.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_imgproc.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_imgcodecs.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_highgui.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_flann.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_features2d.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_core.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_calib3d.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_features2d.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_ml.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_highgui.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_videoio.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_imgcodecs.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_flann.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_video.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_imgproc.so.3.1.0 
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib/libopencv_core.so.3.1.0 -Wl,-rpath,
/home/me/Software/OpenCVLibs/opencv-3.1.0/release/lib 
CMakeFiles/DisplayImage.dir/DisplayImage.cpp.o: In function `main':
DisplayImage.cpp:(.text.startup+0xb8): undefined reference to `cv::imread(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
DisplayImage.cpp:(.text.startup+0x1d7): undefined reference to `cv::namedWindow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'
DisplayImage.cpp:(.text.startup+0x1f4): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
DisplayImage.cpp:(.text.startup+0x223): undefined reference to `cv::imshow(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)'
collect2: ld returned 1 exit status

从这次通话中,我认为应该使用了自定义位置中的库。为什么会失败呢?我在两台机器上都 运行 opencv_test_imgcodecs,效果很好。 任何想法如何解决我的问题?是因为第二个系统上安装了其他 OpenCV 吗? 在此先感谢您的帮助!

我可以通过更改 CMakeList.txt 来解决我的问题。我知道有

find_package( OpenCV HINTS "~/Software/OpenCVLibs/opencv-3.1.0/release/share/OpenCV/" )

在里面。之前只是

find_package( OpenCV Required )

现在我也不再需要指定 OpenCV_DIR 并且可以使用以下方式构建:

cmake -DCMAKE_BUILD_TYPE=Release exampleSourceDir
make

大多数时候我认为这是一个更普遍的 CMake 错误。

我刚遇到同样的错误:

undefined reference to 'cv::imshow(cv::String const&, cv::_InputArray const&)'

对我有用的修复方法是将我的 CMakeLists.txt 从:

add_executable(rekf
  src/rekf/rekf_node.cpp
  src/rekf/ros_rekf.cpp
  src/rekf/rekf.cpp)
add_dependencies(rekf ${catkin_EXPORTED_TARGETS})
target_link_libraries(rekf ${catkin_LIBRARIES})

收件人:

add_executable(rekf
  src/rekf/rekf_node.cpp
  src/rekf/ros_rekf.cpp
  src/rekf/rekf.cpp)
add_dependencies(rekf ${catkin_EXPORTED_TARGETS})
target_link_libraries(rekf ${OpenCV_LIBS} ${catkin_LIBRARIES})