CMakeLists 理解
最近发现其实之前对CMakeLists 理解不是很全面, 零零散散在网上看到的一些教程,其实都是为了解决某个命令的问题,要不然就是对一些命令的翻译理解,实际上是很劝退的.
因此写一些自己对CMakeLists的具体理解,若有不当的地方欢迎指正.
1.基础理解
CmakeLists 本质上是一种生成Cmake file 文件的工具, 方便之后GNU编译使用.
那么这里理解成,CMakeLists 里面的最主要指令,可以简单理解为
链接文件 和 生成文件
由此生成一些可执行文件,这些文件是与另外一些文件链接起来的
2.add_executable()
这就是生成文件的入口,理论上,如果我们要生成一个可执行文件来自main.cpp 可以直接写成
add_executable(main.o, main.cpp)
这里默认了一件事情, 即我们main.cpp 可以单独被执行,没有其他的依赖项.若有依赖项文件,可以添加到后面, 例如
add_executable(main.o main.cpp depend.cpp)
这里就出现了一个问题, 我们在main.cpp 中调用的文件一般都是头文件, 例如 #include<depend.h>, 如果该文件与main.cpp 在同一文件夹内还好,否则是找不到该文件的, 那编译时也就找不到调用的目标了.
所以可以用另一个命令包含该文件夹 例如
include
| depend.h
main.cpp
depend.cpp
CMakeLists.txt
可以使用
include_directories(include)
这样就能找到我们需要的文件 depend.h了
3. link_target_libraries
一般来说我们程序里还会引入很多外部库, 其中包括很多已经编译好的库文件, 例如常用的Opencv 等等
假设我们想要调用一个Opencv 里很简单的cv imshow 函数用来显示一个图像.
编译时会发生什么呢, 首先还是一样,我们需要引入头文件的位置,这样我们程序里#include 才能找到位置.
include_directories(OpenCV_INCLUDE_DIRS) #这里OpenCV_INCLUDE_DIRS 就是opencv 头文件所在位置
那么接下来我们是不是也应该找到imshow的实现文件,并且加入add_executable 中去呢, 可以, 但是确实没有必要. 对大部分第三方库,我们安装的时候都会生成一些 .so 文件, 如果我们使用
add_executable(main.o main.cpp depend.cpp)
target_link_libraries(main.o OpenCV_LIBRARIES)
4. find_package()
那么问题又出现了,我们知道对于一个第三方库来说,常常会有很多文件,也会有很多个lib 文件. 我们手动添加显然是不合适的, 而且是一个很大的工作量, 那么就可以使用
find_package(opencv)
来寻找系统中已经安装好的,opencv, 一旦找到, OpenCV_INCLUDE_DIRS 和 OpenCV_LIBRARIES 就会被赋值为这写路径, 之后我们就可以直接使用了
总体来看 即为
cmake_minimum_required(VERSION 3.5) #通用 部分 设置Cmake 的最低版本
PROJECT(main) # 设置项目名称
find_package(opencv)
include_directories(include)
include_directories(OpenCV_INCLUDE_DIRS) #这里OpenCV_INCLUDE_DIRS 就是opencv 头文件所在位置
add_executable(main.o main.cpp depend.cpp)
target_link_libraries(main.o OpenCV_LIBRARIES)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)