This website is under CONSTRUCTION

CMake 学习小结

高考完这段时间点子大概比较多?既然学了两年的信息学奥赛写了两年 C++ ,却根本不会用 C++ 去做开发,这次正好想做的一个东西对性能要求比较高,就考虑用 C++ 来做,又因为原来一直用的 Java 导致我比较关注多平台的兼容,就想趁机学习一下 CMake 这类通用构建工具。这篇文章会列举一下我学到的 CMake 常用的命令,做一个小结。

如果想要学习 CMake ,非常推荐 CMake 官方提供的教程 ,跟下来的话 CMake 基本就可以掌握了。

基本信息

这些就是些必填的东西

cmake_minimum_required (VERSION 3.8)

project (<PROJECT_NAME>)

子目录

用来标记该项目要使用到(存在 CMakeLists.txt)的子目录,致使 CMakeLists.txt 比 源代码 还多的原罪啊

add_subdirectory(<PATH>)
编译可执行文件

将标记的源代码文件编译成可执行文件

add_executable(<EXEC_FILE_NAME> <SOURCE_CODE_FILE。..>)
编译库文件

将标记的源代码文件编译成为链接库文件

add_library(<LIB_FILE_NAME> <SOURCE_CODE_FILE。..>)
安装

关于 install 的用法极多,具体还是查阅手册比较好 在我项目里用来引入 Duktape 库 install(TARGETS duktape DESTINATION lib)

install(...)
预编译库的引入

一个 EXEC_FILE_NAMEEXEC_FILE_NAME 可作为 TARGET_NAME ,本质上是将该预编译库链接在 obj 文件中,这也就是说需要先存在一个 EXEC_FILE_NAMEEXEC_FILE_NAME,请保证调用此命令前调用过相应的 add_executableadd_library,否则会报 Cannot specify include directories when use target target_include_directories 错误

target_link_libraries(<TARGET_NAME> <PUBLIC|SHARED|PRIVATE> <LIB_NAME>)
头文件目录的引入

经常要用的,我的项目中是用了很多 stb 项目的头文件 target_include_directories(${PROJECT_NAME} PUBLIC stb)TARGET_NAME 的要求同上

target_include_directories(<TARGET_NAME> <PUBLIC|SHARED|PRIVATE> <DIR_NAME>)
获取文件夹下所有源文件

将根目录下所有文件文件名转储到一个变量里,在添加可执行文件时的例子: add_executable (${PROJECT_NAME} ${<VARIABLE_NAME>})"

aux_source_directory(. <VARIABLE_NAME>)
生成 Config 文件

在编译时生成 config 文件以便在不同要求,不同操作系统下编译或输出文件

configure_file(Config.h.in Config.h)