Cmake 最通俗讲解(一)
Cmake写在一个叫做CMakeLists.txt的文件里面
1. 最基本的操作
为啥说是最基本的?作为小白,在很长一段时间内,使用这些函数就已经足够。如果你也是小白一枚,就可以在这停下去学习其他知识了(比如OpenCV)。
1.1 定义最低Cmake版本
#CMake的最低版本是3.0
#如果Cmake的版本低于3.0,那就无法形成Makefile
cmake_minimum_required(VERSION 3.0)
1.2 定义项目的名称
#项目的名称(工程名)为Work
#同时,项目的名称保存在变量PROJECT_NAME中
project(Work)
1.3 形成可执行文件
#生成可执行文件
#第一个变量填入可执行文件名,后一个变量填入源文件
#这个的含义是编译源文件main.cpp,使之形成可执行文件main
add_executable(main main.cpp)
1.4 创建一个库
#创建一个库
#第一个变量是库名称,后面的所有变量都是源文件
#把hello.cpp和hello.h形成hello库
#当然,我们在库名与源文件之间添加SHARED或者STATIC字样以达到生成共享(.so/.dll)或者静态库(.a/.lib)
add_library(hello hello.cpp hello.h)
1.5 链接一个库
#链接一个库,将可执行文件链接到所需的库
#第一个变量是可执行文件,后面的所有变量是需要链接的库
target_link_libraries(main hello)
2. 管理依赖项
限制一个项目的依赖,稍微有点用不到
2.1 最小版本依赖包检查
#依赖最小版本
#这里依赖的最小版本是 OpenCV库的3.4.6 版本,在此版本之前的库都是不能使用的
find_package(OpenCV 3.4.6 REQUIRED)
- 注释:find_package不仅仅有这一个作用,详情可百度。
- 如果出现错误,则无法编译。
2.2 向环境中添加指定库的头文件和路径
通常,Linux平台是不需要这些命令行的
#向该环境中添加OpenCV的头文件
include_directories(${OpenCV_INCLUDE_DIRS})
#向该环境中添加OpenCV的路径
link_directories(${OpenCV_LIB_DIR})
3. 一些比较重要的函数
这个里面是一些大杂烩,所以乱炖就好,不成体系。
3.1 定义一个新的变量
#这样的话,main.cpp就变成了hh
#第一个变量是名称,后面的所有变量是添加进入的东西(各种乱七八糟的东西,例如:源文件)
#注意,后面的变量可以添加很多很多,不仅仅是一个
set(hh main.cpp)
#在调用的时候,${hh}才是main.cpp
add_executable(main ${hh})
3.2 发布消息
#在终端可以直接显示的消息
#在里面加入“”之后,在“”里面直接写需要的内容
message("OpenCV VERSION: ${OpenCV_VERSION}")
4. 主项目与子项目
一般来说,我们会把一个完整的项目分开实现。这个时候,主项目与子项目就出现了。
相应的,我们要构建Cmake也是如此。(如下图)
4.1 所有的代码
4.1.1 主项目
#Cmake版本约束与工程构建
cmake_minimum_required(VERSION 3.0)
project(Bloc)
#约束OpenCV库
find_package(OpenCV 3.4.6 REQUIRED)
#添加一个文件夹
add_subdirectory(demo)
#创建可执行文件main
add_executable(main main.cpp)
#链接可执行文件
target_link_libraries(main ${OpenCV_LIBS} Demo)
4.1.2 子项目
#添加一个新变量——src for lib
set(demo_lib_src
demo1.cpp
demo2.cpp
demo3.cpp)
#创建一个lib
add_library(Demo ${demo_lib_src})
#确保编译器可以找到库的include文件
#CMAKE_CURRENT_SOURCE_DIR 表示的是主目录的位置
target_link_libraries(Demo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
4.2 主项目
4.2.1 添加子文件
#括号里面直接添加文件夹(demo)
add_subdirectories(demo)
其他函数都是我们已经提到过的
当然,仅凭这些是不能够完成一个非常漂亮的项目。但是,实现简单内容还是可以的。
————————————————————————————————————————
高山仰止,景行行止,虽不能至,然心向往之。
——《诗经·小雅》