CMake 常用命令速查

本文只是给出一个大概的说明,命令的详细用法以官方的参考手册为准

项目管理

命令说明
project(name)指定当前项目的名称,一般是第一句,不用打引号
cmake_minimum_required(VERSION 3.4.1)指定最低版本
if(UNIX), endif()判断当前系统是否是 Unix/Linux
if(WIN32), endif()判断当前系统是否是 Windows
if(str1 STREQUAL str2), else(), endif()判断字符串是否相等
set(var value)设置值。如果值比较长,可以直接在引号里面换行,不需要 \n
set(var value CACHE STRING "description")创建一个变量(选项),默认值为 value(用户可使用 -D 更改其值),可以把 STRING 改成 PATHFILEPATH,在 CMake GUI 中会变成目录选择对话框
option(var description OFF)添加一个开关选项,描述内容必须要填
message(STATUS|WARNING|FATAL_ERROR msg_text)输出状态信息,如果输出 FATAL_ERROR 则结束
add_subdirectory(dir)加载并处理一个子文件夹下的 CMakeLists.txt 文件
include(file_or_module)加载并处理一个 .cmake 文件
return()直接从当前 cmake 文件返回
ExternalProject_Add()从外部下载并构建项目(作用于编译期),详见官方文档
FetchContent_Declare()从外部下载项目(作用于配置期),详见官方文档
add_executable(target WIN32 sources)添加一个可执行文件(WIN32 表示入口点是 WinMain 而不是 main,不影响 Linux)
add_custom_command(...)添加编译前/后要执行的自定义命令,或者添加一个能生成一些文件的命令。参数较多请看官方文档
add_custom_target(...)添加新的编译目标,且可以自定义命令,参数较多请看官方文档
add_dependencies(target dep1 dep2)给一个编译目标(通常是 add_library 等创建的目标)添加依赖
install(TARGETS ${TARGT} RUNTIME DESTINATION dest_dir)安装命令,把编译后的文件复制到该文件夹下,参数较多请看官方文档

当你使用 ExternalProject_Addadd_custom_commandadd_custom_target 执行自定义命令时,如果传入的命令是一个字符串,通常你需要使用 seperate_arguments(YOUR_OUT_CMD UNIX_COMMAND ${YOUR_COMMAND_STRING}) 来将其切分。

源文件和头文件

命令说明
include_directories(dir_path...)指定头文件目录
aux_source_directory(dir_path SOURCES)把一个目录中的所有文件视为源文件加入到变量中,这里是 SOURCES
configure_file(input_file output_file)指定一个配置文件(.in 文件)
list(APPEND variable_name value)给列表加入一个项目,例如单独添加一个源文件
string(CONCAT dst_str str)字符串拼接
enable_language(ASM)添加汇编文件支持
add_definitions("-DXX -DXXX=XXX")增加宏定义
set_source_files_properties(file1 file2 PROPERTIES prop1 value1 prop2 value2)设置源文件的属性,如 EXTERNAL_OBJECT TRUE GENERATED TRUE 将允许使用现有的 obj 文件进行链接

命令说明
add_library(name SHARED|STATIC src_file_path...)添加一个库,多个路径之间不用逗号
add_library(name SHARED|STATIC IMPORTED)导入一个已经编译好的库
set_target_properties(name PROPERTIES IMPORTED_LOCATION lib_path)对于导入的库,手动指定它的位置
target_link_libraries(target_name lib_name ...)给程序链接依赖的静态库或动态库
target_compile_options(target_name PRIVATE|SHARED ...)给指定目标设置编译选项
target_link_options(target_name PRIVATE|SHARED ...)给指定目标设置链接选项
find_library(variable_name lib_name)搜索库,并赋给变量
link_directories(lib_path)指定链接器搜索目录
find_package(name COMPONENTS components REQUIRED)搜索包(如 wxWidgets),而且是必须找到

尝试静态链接C库,即使使用了 -static 发现仍然不是静态链接的。需要加上

set_target_properties(myexe PROPERTIES
  LINK_SEARCH_START_STATIC ON
  LINK_SEARCH_END_STATIC ON)
  1. 如果希望使用 find_package 来寻找一个包,则该包必须在 /usr/lib/cmake/ 等目录下提供了 <PackageName>Config.cmake<lower-case-package-name>-config.cmake。此外,还可以提供 Find<PackageName>.cmake,例如 /usr/share/cmake-3.18/Modules/FindPython3.cmake。参考 Using Dependencies Guide
  2. 如果希望使用 pkg_search_module 来寻找一个包,则必须先执行 include(FindPkgConfig),且该包必须提供了 .pc 文件,.pc.in 示例如下:
prefix="@CMAKE_INSTALL_PREFIX@"
exec_prefix="${prefix}"
libdir="${prefix}/lib"
includedir="${prefix}/include"

Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
URL: @PROJECT_HOMEPAGE_URL@
Version: @PROJECT_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -lmy_library

使用时:

configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/share/pkgconfig/${PROJECT_NAME}.pc.in
    ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
    @ONLY
)
install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
    DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/pkgconfig
)

变量

变量说明
CMAKE_PROJECT_NAME项目名称
CMAKE_CXX_STANDARDC++ 标准,如 11
CMAKE_CXX_STANDARD_REQUIRED设置 ON
CMAKE_CXX_FLAGS_DEBUGC++ 调试编译时使用的标志
CMAKE_CXX_FLAGS_RELEASEC++ 发行编译时使用的标志
CMAKE_EXE_LINKER_FLAGS链接时的标志
CMAKE_SHARED_LIBRARY_LINK_C_FLAGS共享库链接标志
CMAKE_BUILD_TYPE编译类型,DebugReleaseMinSizeRelRelWithDebInfo 四种
CMAKE_INSTALL_PREFIX安装目录前缀
CMAKE_MODULE_PATH模块路径,那里应该有一些 modulename.cmake 文件
TARGETS目标文件
SOURCES源文件
PROJECT_LINK_LIBS链接文件列表
CMAKE_SOURCE_DIR 或 PROJECT_SOURCE_DIR项目源文件路径(默认就是 CMakeList.txt 所在路径)
CMAKE_BINARY_DIR 或 PROJECT_BINARY_DIR项目二进制文件路径(默认就是 CMakeList.txt 所在路径)
CMAKE_CURRENT_BINARY_DIR外部编译时,指的是target目录,内部编译时,指的是顶级目录
CMAKE_CURRENT_SOURCE_DIRCMakeList.txt 所在的目录
CMAKE_CURRENT_LIST_DIRCMakeList.txt 的完整路径
CMAKE_TOOLCHAIN_FILECMake 将会自动处理这个变量指定的 CMake 文件,其中设置了交叉编译相关的变量
CMAKE_C_COMPILER指定 C 编译器
CMAKE_CXX_COMPILER指定 C++ 编译器
CMAKE_LINKER指定 LD 工具
CMAKE_OBJCOPY指定 OBJCOPY 工具
CMAKE_OBJDUMP指定 OBJDUMP 工具
CMAKE_SIZE指定 SIZE 工具
CMAKE_ASM_COMPILER指定汇编器
CMAKE_VERBOSE_MAKEFILE默认为 FALSE,设置为 TRUE 则显示 Makefile 的详细内容,用于调试构建系统
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值