最近在看人民郵電出版社的馮振的《OpenCV4快速入門》,在從源碼一路編譯完成OpenCV4.5的安裝后,cmake問題不大,但是make時,總會出現:
1 make 2 [ 50%] Linking CXX executable videoCapture 3 /usr/bin/ld: /usr/local/lib/libopencv_core.so.4.5.0: undefined reference to `cblas_dgemm' 4 /usr/bin/ld: /usr/local/lib/libopencv_core.so.4.5.0: undefined reference to `cblas_cgemm' 5 /usr/bin/ld: /usr/local/lib/libopencv_core.so.4.5.0: undefined reference to `cblas_zgemm' 6 /usr/bin/ld: /usr/local/lib/libopencv_core.so.4.5.0: undefined reference to `cblas_sgemm' 7 collect2: 錯誤:ld 返回 1 8 make[2]: *** [CMakeFiles/videoCapture.dir/build.make:118:videoCapture] 錯誤 1 9 make[1]: *** [CMakeFiles/Makefile2:95:CMakeFiles/videoCapture.dir/all] 錯誤 2 10 make: *** [Makefile:103:all] 錯誤 2
看下代碼videoCapture.cpp,來自書本上的代碼,吐槽下,該書中的\和/不分,希望看同本書的同志注意下,反正我在linux下沒有一次運行成功:
1 #include <opencv2/opencv.hpp> //#include <opencv2\opencv.hpp>原書的,實際時不對的,也許是我在linux下原因吧 2 #include <iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 system("color F0"); //¸ 10 VideoCapture video("cup.mp4"); 11 if (video.isOpened()) 12 { 13 cout << "視頻圖形寬度=" << video.get(CAP_PROP_FRAME_WIDTH) << endl; 14 cout << "視頻圖形高度=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl; 15 cout << "視頻幀率=" << video.get(CAP_PROP_FPS) << endl; 16 cout << "視頻的總幀數=" << video.get(CAP_PROP_FRAME_COUNT); 17 } 18 else 19 { 20 cout << "請確認視頻文件名稱是否正確·" << endl; 21 return -1; 22 } 23 while (1) 24 { 25 Mat frame; 26 video >> frame; 27 if (frame.empty()) 28 { 29 break; 30 } 31 imshow("video", frame); 32 waitKey(1000 / video.get(CAP_PROP_FPS)); 33 } 34 waitKey(); 35 return 0; 36 }
CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6) 2 #創建工程 3 project(videoCapture) 4 #C++版本為 11 5 set(CMAKE_CXX_FLAGS "-std=c++11") 6 #set(CMAKE_EXE_LINKER_FLAGS "-lcblas") 7 8 find_package(OpenCV 4.1.0 REQUIRED) #找 OpenCV 4.0 安裝路徑 9 include_directories(${OpenCV_INCLUDE_DIRS}) #加載 OpenCV 4.0 的頭文件 10 11 12 add_executable(videoCapture VideoCapture.cpp) #將程序生成可執行文件 13 target_link_libraries(videoCapture ${OpenCV_LIBS}) #鏈接 lib 文件到可執行文件中
當沒有第6行時,按照常規方法:
mkdir build && cd build
cmake ..
make時總會出現文章開始的錯誤,原來的解決方法是在make時加上參數: -DCMAKE_EXE_LINKER_FLAGS=-lcblas,
后來覺得每次都要加上參數很不方便,就在CMakeLists.txt中加上第6行的內容后,編譯的步驟終於成為了:
mkdir build
cd build
cmake ..
make
好了就可以了,大公告成