Ubuntu系统---编译opencv程序的两种方式g++、cmake

Ubuntu系统---编译opencv程序的两种方式g++、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程序的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

三、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++程序

 

猜你喜欢

转载自www.cnblogs.com/carle-09/p/11321834.html
今日推荐