Ubuntu下clion编写OpenCV程序的cmakelist
单个源文件的cmakelist.txt
对于简单的项目,只需要写几行代码就可以了。例如,现在我们的项目中只有一个源文件 main.cpp,该程序的用途是读取一幅图像并显示。
/*
函数功能:读取图片并显示
*/
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
IplImage *img1;
char img1_file[] = "/home/elsie/CLionProjects/sift/pc1.jpg";
img1 = cvLoadImage(img1_file,1);
cvShowImage("test",img1);
cvWaitKey(0);
cvReleaseImage(&img1);
return 0;
}
打开clion时会自带一个cmakelist.txt,其中包含了
#指定运行此配置文件所需的 CMake 的最低版本
cmake_minimum_required(VERSION 3.5)
#项目名称
project(untitled)
#指定生成目标
add_executable(untitled main.cpp)
#设置编译器版本
set(CMAKE_CXX_STANDARD 14)
但是要编译OpenCV程序还需要再做一下几步:
#寻找OpenCV库
find_package(OpenCV)
#OpenCV库的包含文件
include_directories(${OpenCV_INCLUDE_DIRS})
#设置源文件(主文件)
set(SOURCE_FILES main.cpp)
#设置动态链接库
target_link_libraries(untitled ${OpenCV_LIBS})
这样就可以啦,不过要注意要先指定生成目标才能设置后面的,总之就是
cmake_minimum_required(VERSION 3.5)
project(untitled)
add_executable(untitled main.cpp)
find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})
set(CMAKE_CXX_STANDARD 14)
set(SOURCE_FILES main.cpp)
target_link_libraries(untitled ${OpenCV_LIBS})
同一目录下多个源文件
如果项目有多个函数的话,会有多个.h,.cpp文件,上述办法只声明了动态链接库的话会导致这些函数的报错“未定义的引用”,多个源文件应该还要注明自己写的这些函数
#设置最低版本的cmake要求
cmake_minimum_required(VERSION 3.5)
#设置项目信息
set(PROJECT_NAME sift)
project(${PROJECT_NAME})
#寻找opencv库
find_package(OpenCV)
#库的包含目录
include_directories(${OpenCV_INCLUDE_DIRS})
#打印调试信息
MESSAGE(STATUS "Project:sift")
MESSAGE(STATUS "Project Dirrectory: ${PROJECT_SOURCE_DIR}")
#设置调试模式,debug会输出调试信息
SET(CMAKE_BUILD_TYPE DEBUG)
#设置编译器版本
set(CMAKE_CXX_STANDARD 14)
#设置源文件(主文件名)
set(SOURCE_FILES match.cpp)
#设置要生成可执行程序的文件名
add_executable(sift ${SOURCE_FILES})
#添加自己写的其他函数文件,注意这个名字不能和工程名冲突
ADD_LIBRARY(mysift STATIC imgfeatures.cpp imgfeatures.h kdtree.h kdtree.cpp minpq.h minpq.cpp sift.h sift.cpp utils.cpp utils.h xform.h xform.cpp)
#设置链接库
target_link_libraries(sift ${OpenCV_LIBS} mysift)
这样写是没什么问题,但是如果源文件很多,把所有源文件的名字都加进去将是一件烦人的工作。更省事的方法是使用
aux_source_directory
命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:
aux_source_directory(<dir> <variable>)
写成
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
多个目录下多个源文件
好像还没用到,参考https://www.cnblogs.com/ningskyer/articles/7158948.html