Ubuntu系統---編譯opencv程序的幾種方式g++、Makefile、Cmake
先建立一個工程(一個文件夾),寫好xxx.cpp文件,可以是多個:
//----------opencv.cpp------------ #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat srcImage = imread("1.jpg"); imshow("源圖像",srcImage); waitKey(0); return 0;
一、編譯opencv程序的g++方式
-------------實踐如下---------------------------
只需要事先准備:opencv.cpp 、 1.jpg
其他文件是生成的
----------------------------------------------------
(1)g++ opencv.cpp -o opencv
"""/tmp/cczsAsbd.o:在函數‘main’中:
opencv.cpp:(.text+0x5c):對‘cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)’未定義的引用
opencv.cpp:(.text+0x90):對‘cv::_InputArray::_InputArray(cv::Mat const&)’未定義的引用
opencv.cpp:(.text+0xd3):對‘cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)’未定義的引用
opencv.cpp:(.text+0xfb):對‘cv::waitKey(int)’未定義的引用
/tmp/cczsAsbd.o:在函數‘cv::Mat::~Mat()’中:
opencv.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39):對‘cv::fastFree(void*)’未定義的引用
/tmp/cczsAsbd.o:在函數‘cv::Mat::release()’中:
opencv.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47):對‘cv::Mat::deallocate()’未定義的引用
collect2: error: ld returned 1 exit status"""
(2)因為在執行時沒有將OpenCV的庫包含進去,可以使用如下命令進行編譯:
g++ `pkg-config opencv --cflags` opencv.cpp -o opencv `pkg-config opencv --libs`
(3)生成名字為opencv的可執行文件,接下來運行
./opencv
---------編譯opencv程序的g++方式---------
-------------事先准備:opencv.cpp 、 1.jpg--------------------------- (1)g++ opencv.cpp -o opencv #會報錯 (2)因為在執行時沒有將OpenCV的庫包含進去,可以使用如下命令進行編譯: g++ `pkg-config opencv --cflags` opencv.cpp -o opencv `pkg-config opencv --libs` (3)生成名字為opencv的可執行文件,接下來運行 ./opencv


二、編譯opencv程序的Makefile方式
暫略
三、編譯opencv程序的cmake方式
------------------參考如下----------------------------
使用cmake編譯OpenCV文件
首先確保已經安裝了cmake,然后建立一個CMakeLists.txt文件,輸入如下內容
cmake_minimum_required(VERSION 2.8)
project(opencv)
find_package(OpenCV REQUIRED)
add_executable(opencv opencv.cpp)
target_link_libraries(opencv ${OpenCV_LIBS})
project()括號里面填寫要生成的文件名稱,add_executable()及其后一行類似,然后可以使用cmake命令運行,此次執行
cmake .
make
./opencv
--------------------- @原文鏈接:https://blog.csdn.net/keith_bb/article/details/52864851
-------------實踐如下---------------------------
只需要事先准備:CMakeLists.txt 、opencv.cpp 、 1.jpg
其他文件是生成的
-----------------------
u@u1604:~/C_learn/opencv/opencv2$ cmake .
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/u/C_learn/opencv/opencv2
u@u1604:~/C_learn/opencv/opencv2$ make
Scanning dependencies of target opencv
[ 50%] Building CXX object CMakeFiles/opencv.dir/opencv.cpp.o
[100%] Linking CXX executable opencv
[100%] Built target opencv
u@u1604:~/C_learn/opencv/opencv2$ ./opencv
---------編譯opencv程序的cmake方式---------
------------CMakeLists.txt--------------------------------
cmake_minimum_required(VERSION 2.8)
project(opencv)
find_package(OpenCV REQUIRED)
add_executable(opencv opencv.cpp)
target_link_libraries(opencv ${OpenCV_LIBS})
#project()括號里面填寫要生成的文件名稱,add_executable()及其后一行類似,然后可以使用cmake命令運行,此次執行
--------------------執行-----------------------------------
(1)cmake .
(2)make
(3)./opencv
cmake_minimum_required(VERSION 3.5)#cmake版本 project( DisplayImage )#項目名稱 find_package( OpenCV REQUIRED )#找到opencv源 add_executable( DisplayImage main.cpp )# target_link_libraries( DisplayImage ${OpenCV_LIBS} )#添加opencv鏈接選項

三、g++同時編譯多個文件的方法,舉例:
gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步:
1.預處理,生成.i的文件[預處理器cpp]
2.將預處理后的文件轉換成匯編語言,生成文件.s[編譯器egcs]
3.由匯編變為目標代碼(機器代碼)生成.o的文件[匯編器as]
4.連接目標代碼,生成可執行程序[鏈接器ld]
g++同時編譯多個文件的方法,舉例: 使用cd命令進入包含源文件的文件夾。通過在命令行上列出文件來編譯程序,類型: 方法一:g++ xxx1.cpp xxx2.cpp -o xxx3.out //兩個cpp源文件,編譯后只生成一個 .out 文件 方法二:g++ *.cpp -o xxx2.out //用*號代替目錄下所有要編譯的文件, 使用“通配符”編譯程序:g++ *.cpp -o xxx2.out -ansi
Ubuntu gcc多源文件的編譯方法 如果有多個源文件,基本上有兩種編譯方法:
[假設有兩個源文件為test.c和testfun.c]
1. 多個文件一起編譯
用法:#gcc testfun.c test.c -o test
作用:將testfun.c和test.c分別編譯后鏈接成test可執行文件。
2. 分別編譯各個源文件,之后對編譯后輸出的目標文件鏈接。
用法:
#gcc -c testfun.c //將testfun.c編譯成testfun.o
#gcc -c test.c //將test.c編譯成test.o
#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test
以上兩種方法相比較,
第一種,編譯時需要所有文件重新編譯,
而第二種,可以只重新編譯修改的文件,未修改的文件不用重新編譯。
@https://blog.51cto.com/charlesworld/1683821 Ubuntu下用G++編譯C++程序
