天天看点

Ubuntu下clion编写OpenCV程序的cmakelistUbuntu下clion编写OpenCV程序的cmakelist

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