【问题标题】:CMake does not find OpenCV librariesCMake 找不到 OpenCV 库
【发布时间】:2015-07-12 08:19:03
【问题描述】:

question 类似,我在 OS X 10.10.3 上使用 OpenCV 和 CMake 时遇到了麻烦。

经过一番折腾,我终于设法在我的系统上构建了 OpenCV 3.0 beta;标头现在位于/usr/local/include 中,而库——它们应该——位于/usr/local/lib 中。我有使用 OpenCV 的小程序,我的 CMakeLists.txt 看起来像这样

set( CMAKE_CXX_FLAGS         "-O3 -w" ) 
find_package( OpenCV REQUIRED )
if(OpenCV_FOUND)
   message("Found OpenCV")
   message("Includes: " ${OpenCV_INCLUDE_DIRS})
endif(OpenCV_FOUND)

add_executable( cannyDetector canny/canny.cpp )

target_link_libraries( cannyDetector ${OpenCV_LIBS} )

我还是习惯了

Undefined symbols for architecture x86_64:
  "vtable for cv::_InputArray", referenced from:
      _main in correctImage.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "vtable for cv::_OutputArray", referenced from:
      _main in correctImage.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [correctImage] Error 1
make[1]: *** [CMakeFiles/correctImage.dir/all] Error 2
make: *** [all] Error 2

变量OpenCV_LIBS包含

opencv_xphoto;opencv_xobjdetect;opencv_ximgproc;opencv_xfeatures2d;opencv_tracking;opencv_text;opencv_surface_matching;opencv_saliency;opencv_rgbd;opencv_reg;opencv_optflow;opencv_line_descriptor;opencv_latentsvm;opencv_ccalib;opencv_bioinspired;opencv_bgsegm;opencv_adas;opencv_videostab;opencv_videoio;opencv_video;opencv_ts;opencv_superres;opencv_stitching;opencv_shape;opencv_photo;opencv_objdetect;opencv_ml;opencv_imgproc;opencv_imgcodecs;opencv_highgui;opencv_hal;opencv_flann;opencv_features2d;opencv_core;opencv_calib3d

另外,手动编译也可以:

gcc -o canny $(pkg-config --cflags opencv3)  $(pkg-config --libs opencv3) -lstdc++ -w -O3  ../canny/canny.cpp

(我不知道为什么我必须指定-lstdc++,但没有它,链接会因另一个原因而失败)。 运行make VERBOSE=1 时,可执行以下命令:

/opt/local/bin/g++   -O3 -w -lstdc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/cannyDetector.dir/canny/canny.o  -o cannyDetector  /usr/local/lib/libopencv_xphoto.3.0.0.dylib /usr/local/lib/libopencv_ximgproc.3.0.0.dylib /usr/local/lib/libopencv_tracking.3.0.0.dylib /usr/local/lib/libopencv_text.3.0.0.dylib /usr/local/lib/libopencv_surface_matching.3.0.0.dylib /usr/local/lib/libopencv_saliency.3.0.0.dylib /usr/local/lib/libopencv_rgbd.3.0.0.dylib /usr/local/lib/libopencv_reg.3.0.0.dylib /usr/local/lib/libopencv_optflow.3.0.0.dylib /usr/local/lib/libopencv_line_descriptor.3.0.0.dylib /usr/local/lib/libopencv_latentsvm.3.0.0.dylib /usr/local/lib/libopencv_ccalib.3.0.0.dylib /usr/local/lib/libopencv_bioinspired.3.0.0.dylib /usr/local/lib/libopencv_bgsegm.3.0.0.dylib /usr/local/lib/libopencv_adas.3.0.0.dylib /usr/local/lib/libopencv_videostab.3.0.0.dylib /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_superres.3.0.0.dylib /usr/local/lib/libopencv_stitching.3.0.0.dylib /usr/local/lib/libopencv_photo.3.0.0.dylib /usr/local/lib/libopencv_objdetect.3.0.0.dylib /usr/local/lib/libopencv_hal.a /usr/local/lib/libopencv_xobjdetect.3.0.0.dylib /usr/local/lib/libopencv_xfeatures2d.3.0.0.dylib /usr/local/lib/libopencv_shape.3.0.0.dylib /usr/local/lib/libopencv_video.3.0.0.dylib /usr/local/lib/libopencv_calib3d.3.0.0.dylib /usr/local/lib/libopencv_features2d.3.0.0.dylib /usr/local/lib/libopencv_ml.3.0.0.dylib /usr/local/lib/libopencv_highgui.3.0.0.dylib /usr/local/lib/libopencv_videoio.3.0.0.dylib /usr/local/lib/libopencv_imgcodecs.3.0.0.dylib /usr/local/lib/libopencv_imgproc.3.0.0.dylib /usr/local/lib/libopencv_flann.3.0.0.dylib /usr/local/lib/libopencv_core.3.0.0.dylib /usr/local/lib/libopencv_hal.a -framework AGL -framework OpenGL /usr/local/share/OpenCV/3rdparty/lib/libippicv.a

但是,如果我接受命令并将输入文件CMakeFiles/cannyDetector.dir/canny/canny.o 替换为输入源文件../canny/canny.cpp,它就可以工作!

所以库都在了,但是还是编译不出来,因为编译器无法链接目标文件,但是一步编译链接就可以了。

谁能建议这里发生了什么?

【问题讨论】:

  • 使用 make VERBOSE=yes 获得详细输出 cmake 如何调用编译器
  • 可能已经使用libstdc++ 构建了OpenCV 库,而CMake 可能正在尝试使用libc++。建议:尝试在 CMake 文件中添加set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++")
  • @Kiran 你是对的,因为该标志是绝对需要的,但它的缺失不会导致错误,但 CMake 拒绝找到 usr/local/lib 中的库这一事实。跨度>
  • 请添加message("OpenCV_LIBS=${OpenCV_LIBS}") 并发布输出。检查您是否真的设法构建 highgui:有时 OpenCV 中的库禁用(例如,由于缺少一些第 3 方库)并不那么明显。此外,如果您运行make VERBOSE=1,您可以看到实际的链接器命令行。
  • 在再次编译库后,我已更新问题以反映我遇到的错误的最新变化。 @Antonio 这绝对不是特定库的问题,这些都已构建并准备就绪。

标签: c++ opencv linker cmake makefile


【解决方案1】:

在我的情况下,解决方法是指示 CMake 在哪里寻找 OpenCV 配置模块。

find_package(OpenCV REQUIRED PATHS /usr/local/share/OpenCV NO_DEFAULT_PATH) # manual specification of the OpenCVConfig.cmake path is necessary since otherwise, cmake assigns /opt/local a higher priority and ocv2.4 will be used

无论出于何种原因,/opt/local/share 的优先级高于/usr/local/share,因此只找到了 OpenCV 2.4 的配置文件,但我使用的是 3.0。我不确定是什么导致了链接错误,但可能一些代码从库移动到版本 3.0 中的标头,必须与用户代码一起编译,但这不是因为 CMake 仅包含版本 2 标头。

还有

include_directories(${OpenCV_INCLUDE_DIRS})

不见了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 2018-02-07
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多