cmake入门笔记
linux下opencv程序有两种编译方式,一种是使用gcc/g++结合pkg-config的方式;另一种是使用cmake。因此,我就学习了一下cmake的使用,在这里做一下记录。我使用的cmake version 2.8.12.2。
cmake简介
cmake是一个跨平台的开源安装编译工具,可以用简单的语句描述所有平台的安装以及编译过程。能输出各种形式的Makefile或者project文件。
环境搭建
cmake安装十分方便,在终端输入:
sudo apt-get install cmake
示例
一、简单示例
1、编写一个简单程序(test.cpp)
#include<iostream>
using namespace std;
int main()
{
cout<<"Hello World!"<<endl;
return 0;
}
2、编写CMakeLists.txt文件
在test.cpp同一目录中新建CMakeLists.txt文件,内容如下:
project(hello)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. DIR_MIAN)
add_executable(test ${DIR_MIAN})
cmake语法由命令,注释(#)和空格组成,其中命令不区分大小写。符号#
后面的内容被认为是注释,命令由命令名称、小括号和参数组成,参数之间使用空格分开。
上面的CMakeLists.txt具体含义:
1. project
命令表示项目名称为hello
;
2. cmake_minimum_required
命令限定cmake的版本最少为2.8;
3. aux_source_directory
命令是将当前目录下的源文件名称赋值给DIR_MIAN
变量;
4. add_executable
命令表示要将DIR_MIAN
中的源文件编译成一个名为test
的可执行文件。
3、编译执行
在当前目录下执行命令:
cmake .
make
./test
二、多源文件目录实例
学习cmake的目的是需要使用opencv,因此这里的例子是opencv的简单例子。
文件分布情况:
./test
|
+--- test.cpp
+--- lena.jpg
+--- src
|
+--- my_opencv_tool.h
+--- my_opencv_tool.cpp
1、源码
test.cpp:
#include"my_opencv_tool.h"
using namespace cv;
int main()
{
Mat img = imread("lena.jpg");//读取图片
assert(img.data);
my_imshow("test",img); //显示图片
waitKey(0);
return 0;
}
my_opencv_tool.h:
#ifndef __MY_OPENCV_TOOL__
#define __MY_OPENCV_TOOL__
#include<iostream>
#include<cv.h>
#include<highgui.h>
using namespace std;
using namespace cv;
void my_imshow(const string& win_name,const Mat& img);
#endif
my_opencv_tool.cpp:
#include"my_opencv_tool.h"
void my_imshow(const string& win_name,const Mat& img)
{
namedWindow(win_name);
imshow(win_name,img);
}
2、编写主目录下的CMakeLists.txt
在test
目录下创建CMakeLists.txt,内容:
project(opencv)
cmake_minimum_required(VERSION 2.8)
add_subdirectory(src)
aux_source_directory(. DIR_SRCS)
include_directories(src)
add_executable(test ${DIR_SRCS})
target_link_libraries(test libmy_opencv_tool)
find_package(OpenCV REQUIRED)
target_link_libraries(test ${OpenCV_LIBS})
这里跟上一个例子中新增了一些命令:
1. add_subdirectory
命令用来添加一个需要进行构建的子目录;
2. include_directories
命令用来设定头文件目录;
3. target_link_libraries
命令用来指定test
需要链接后面的库,libmy_opencv_tool
是我src
目录下文件生成的库,${OpenCV_LIBS}
表示opencv的库。
4. find_package
会根据cmake内置的脚本去找相应库的模块,REQUIRED
表示必须的。
3、编写子目录下的CMakeLists.txt
在src
子目录下创建CMakeLists.txt,内容如下:
aux_source_directory(. DIR_MY_TOOL)
find_package(OpenCV REQUIRED)
add_library(libmy_opencv_tool ${DIR_MY_TOOL})
target_link_libraries(libmy_opencv_tool ${OpenCV_LIBS})
4、编译执行
在test
目录下执行命令:
cmake .
make
./test
参考:
http://blog.csdn.net/fan_hai_ping/article/details/42524205
https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html