目录
- 基本语法
- 命令行
- project
- add_executable
- target_sources
- set
- file
- add_library
- message
- target_link_libraries
- target_include_directories
- find_package
- 标准模板
基本语法
命令行
- cmake -B build
进行build目录的创建与Makefile等构建文件的生成。
可加参数 -DCMAKE_BUILD_TYPE=RELEASE 自由调节编译的模式。
可加参数 -G Ninja 改变构建时候用的程序,由于Ninja出现的比较晚,性能表现上一般会更好。 - cmake --build build
在build目录下并行构建。
可加参数 --parallel 32 进行并行构建
project
- 参数加上项目的名字,比如 project(hello_world) 。
- 这个有什么用呢,其实没什么用,但是又有那么一点用。
- 比如 MSVC 会使用这个项目名在 build 里面生成 hello_world.sln 文件以作他用,也算是一点用。
- 同时这个命令会初始化一些可以访问的变量,例如 PROJECT_NAME,会输出 hello_world。类似的还有
1. PROJECT_SOURCE_DIR
2. PROJECT_BINARY_DIR
3. CMAKE_CURRENT_SOURCE_DIR
4. CMAKE_CURRENT_BINARY_DIR
5. 等~ - 还有一个很重要的参数 LANGUAGES 字段,默认情况下为 C 和 CXX,使用这个参数则可以明确的指定项目需要的语言(可以多于一种)。例如如果指定了语言为 CXX,那么添加一个C语言的文件就会报错。
add_executable
- 第一个参数是可执行文件的名称,指明生成的可执行文件
- 之后的参数写可执行文件所依赖的cpp文件,这部分可以暂时不加后面的依赖文件,后续通过 target_sources 命令补加。
target_sources
- 补充上一条命令,为可执行文件添加依赖的cpp文件。第一个参数写可执行文件,第二个参数写 PUBLIC 表示依赖的权限,之后的参数写依赖的文件cpp文件。
set
- 比较重要的一条命令,定义 cmake 中的变量。第一个参数写变量的名称,后续参数写变量所指代的内容。
- cmake 所定义的变量在后续的使用时要通过 ${变量名} 语法进行访问。
file
- 也是一条定义变量的命令,在形式上为set的书写做了一些简化
- 第一个参数可以写 GLOB 表示当前目录的搜索,也可以写 ** GLOB_RECURSE** 表示当前目录与其子目录递归的搜索。
- 第二个参数写变量名。
- 第三个参数可写可不写,CONFIGURE_DEPENDS 表示后续的文件产生增加等变化时cmake会重新进行一次构建,如果不写这个参数那么添加一个新的cpp可能就不能被及时的放进变量中,导致编译失败。
- 之后的参数形如 *.cpp *.h 等,表示通配的内容,当前目录下所有类似形式的文件名都会被放入变量之中以供取用。
add_library
- 生成库文件,第一个参数是库文件的名称,第二个参数可以用STATIC或者SHARED,分别代表动态库和静态库,之后的参数写库所依赖的cpp文件即可。
- 还有一种很厉害的库叫对象库,参数用 OBJECT 表示。对象库厉害就厉害在他不生成一个库,而是直接把库内容植入使用库的可执行文件中,浑然天成。那有人就会问了,不生成库直接植入在可执行文件中,那我为什么还要打一个库,岂不是多此一举,直接把cpp依赖加入可执行文件不就行了。诶,这你就有所不知了,我自己打成一个库不就可以使用和可执行文件不同的编译选项。
- 在 linux 下生成的静态库以 .a 结尾,动态库以 .so 结尾。
- 在 windows 下静态库以 .lib 结尾,动态库以 .dll 结尾。
message
- 打印指令,里面加字符串可以在cmake的时候输出信息,字符串中可以使用 ${变量名} 语法来打印之前定义的变量。
- 这个命令可以加修饰符来表示不同信息的打印
- 可以什么都不加,直接写一个字符串,这个情况就表示我知道你很急,但是你先别急,字符串会直接打印在屏幕上不加任何修饰。
- 可以加 STATUS 再写字符串,这个情况是正常的信息输出,一般会在前面给加两个杠 “--”。
- 可以加 WARNING,这个情况表示值得注意了,可能与预期不符,一般会改变成黄色并和下面留出一段距离。
- 可以加 FATAL_ERROR,这个情况就非常的危及,发生了红色错误并且直接停止 cmake,比如用 find_package 寻找一个库找不到的时候就会发这个信息。
- 可以加 SEND_ERROR,也是发红色错误信息,但是并不停止 cmake,应该是还没有危及到生命。
target_link_libraries
- 创建了可执行文件和库文件之后,如果想用可执行文件就需要这个命令。他的第一个参数是希望添加的目标可执行文件,第二个参数是 PUBLIC 表示链接权限,之后的参数写想要链接的库文件。
target_include_directories
- 添加我们某一个目录为目标文件的include搜索目录。
- 第一个参数写目标文件,可以是一个可执行文件也可以是一个库文件。
- 第二个参数写 PUBLIC 或者 PRIVATE,表示添加的权限,如果是公有的那么在其他可执行文件链接的时候也会传播include的搜索目录,私有的则不会。
- 之后的参数需要能够表示一个目录的路径,例如写一个库文件就表示库文件所在的目录路径,写一个 . 就表示目标文件所在的目录路径。
find_package
- 通过 find_package 这个命令查找预安装的库,原理是通过执行预安装的 XXXConfig.cmake 文件,通过这个文件引入一些依赖或定义一些变量,然后我们的项目中就可以使用这个库了。
- 例如 find_package(TBB REQUIRED) 这个命令就会执行 TBBConfig.cmake 引入 TBB 这个库。
- REQUIRED 表示在找不到所需的包时发出错误信息并停止构建,如果省略了 REQUIRED 则当 cmake 没有找到 TBB 时会继续构建,这可能导致编译错误或运行时错误。
- find_package(TBB) 会把一个变量 TBB_FOUND 根据有没有找到设置为 treu 或 false。如果不加 REQUIRED 选项也是可以的,这时就需要用户通过手动判断 TBB_FOUND 来保证安全,例如在未找到库时可以发出一段警告,或者通过 TBB_FOUND 的值来定义一个 WITH_TBB 的宏在源文件内,通过这个宏分别实现带 TBB 库和不带 TBB 库的两套版本。
标准模板
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)