與此question類似,我在OS X 10.10.3上使用OpenCV和CMake時遇到了麻煩。CMake找不到OpenCV庫
經過很多麻煩,我終於設法在我的系統上構建了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
但是,如果我走了命令,並通過輸入源文件../canny/canny.cpp
更換輸入文件CMakeFiles/cannyDetector.dir/canny/canny.o
,它的作品!
所以庫都在那裏,但它仍然不能編譯,因爲編譯器不能鏈接目標文件,但編譯和鏈接在一個步驟的作品。
任何人都可以建議這裏發生了什麼?
使用make VERBOSE = yes獲取詳細輸出cmake如何調用編譯器 – arved
您*可能已經用'libstdC++'構建了OpenCV庫並且CMake可能試圖使用'libC++'。建議:嘗試在CMake文件中添加set(CMAKE_CXX_FLAGS「$ {CMAKE_CXX_FLAGS} -stdlib = libstdC++」)。 – Kiran
@Kiran你說得對,因爲該標誌肯定是必需的,但它的缺席並不會導致錯誤,但是CMake拒絕找到位於'usr/local/lib'中的庫。 – oarfish