CMake学习记录宏macro (do_test arg1 arg2 result)add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})set_tests_properties (test_${arg1}_${arg2}PROPERTIES PASS_REGULAR_EXPRESSION ${result})endmacro (do_test)描述macro(宏名 参数列表)可以定义一个宏第一个参数宏名其余参数在宏当中使用的变量名示例作用定义一个宏简化测试代码的编写add_test用于添加一个测试条件语句if语句if(condition)Tab...else()Tab...endif(condition)常用指令add_definitionsadd_definitions(-DFOO -DBAR123)描述add_definitions是 CMake 中用来 **批量向所有目标可执行文件、库添加编译宏定义**-D选项的命令。实际传给编译器含义-DFOO定义宏FOO空值-DBAR123定义宏BAR为123相当于添加了#define FOO#define BAR 123add_libraryadd_library(function STATICsrc/hello.cpp)描述使用一些源文件生成库第一个参数库名实际生成的名字为libfunction.xxx第二个参数决定生成的库是动态库还是静态库没有则默认静态第三个参数生成库的源文件add_excutableadd_executable(Demo ${DIR_SRCS})描述使用一些源文件编译并链接成一个可执行程序add_subdirectoryadd_subdirectory(math)描述将一个子目录添加到构建系统中参数子目录名称示例代码作用将math子目录中的CMakeLists.txt文件解析并加入到构建系统中aux_source_directoryaux_source_directory(dir variable)描述自动获取指定目录中的所有源文件并将这些文件存储到一个变量中configure_fileconfigure_file(${PROJECT_SOURCE_DIR}/config.h.in${PROJECT_BINARY_DIR}/config.h)描述将一个输入文件通常是模板文件配置为输出文件它会根据CMake变量的值替换输入文件模板文件中的占位符生成最终的配置文件第一个参数模板文件通常以.in为后缀第二个参数输出的配置文件注意点模版文件后缀并非强制要求in只是一种约定模版文件需要我们自己预先定义好生成的文件可以是源文件如.h、.c、.cpp等是也可以其他类型的文件如配置文件等execute_processexecute_process(COMMAND git rev-parse HEADWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}OUTPUT_VARIABLE FULL_SHAOUTPUT_STRIP_TRAILING_WHITESPACE)关键字 / 参数含义execute_processCMake 提供的命令用于在配置阶段执行一条或多条外部命令。COMMAND git rev-parse HEAD要执行的命令运行git rev-parse HEAD获取当前 Git 仓库的完整 SHA 哈希值。WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}指定命令的运行目录为项目根目录${CMAKE_SOURCE_DIR}。OUTPUT_VARIABLE FULL_SHA把命令的标准输出stdout保存到 CMake 变量FULL_SHA。OUTPUT_STRIP_TRAILING_WHITESPACE自动去掉输出FULL_SHA末尾的换行符或空格避免后面使用时出现\n。find_packagefind_package(PackageName [version] [REQUIRED] [COMPONENTS c1 c2...])描述find_package是 CMake最重要、最常用的模块查找指令之一用来在系统中“找到”某个第三方库或工具链并自动为你设置头文件目录、库文件目录、库名称等变量省去手动写include_directories()、target_link_libraries()的麻烦。参数说明PackageName模块名大小写不敏感如OpenSSL,Boost,Threads[version]可指定最低版本如3.1.0REQUIRED找不到就报错构建停止COMPONENTS只找其中某些组件如COMPONENTS system filesystem模式描述文件来源Module 模式使用 CMake 自带的FindPackageName.cmake脚本cmake prefix/Modules/Config 模式使用库自己提供的PackageNameConfig.cmake或PackageName-config.cmake库安装目录的lib/cmake/PackageName/CMake 先尝试 Module再尝试 Config。成功后会生成哪些变量以find_package(OpenSSL REQUIRED)为例变量内容OPENSSL_FOUNDTRUEOPENSSL_INCLUDE_DIR/usr/include/opensslOPENSSL_LIBRARIES/usr/lib/libssl.so;/usr/lib/libcrypto.soOPENSSL_VERSION1.1.1w你可以直接用target_include_directories(myapp PRIVATE ${OPENSSL_INCLUDE_DIR})target_link_libraries(myapp PRIVATE ${OPENSSL_LIBRARIES})一个典型用法示例find_package(PkgConfig REQUIRED)pkg_check_modules(GIO REQUIRED gio-unix-2.0)target_include_directories(my_app PRIVATE ${GIO_INCLUDE_DIRS})target_link_libraries (my_app PRIVATE ${GIO_LIBRARIES})find_package(PkgConfig REQUIRED)作用让 CMake 先找到pkg-config这个系统小工具Linux 下通常是/usr/bin/pkg-config。REQUIRED如果系统没装pkg-config立即报错停止。成功后PkgConfig模块会提供pkg_check_modules()命令。pkg_check_modules(GIO REQUIRED gio-unix-2.0)作用等价于在终端执行pkg-config --cflags --libs gio-unix-2.0。结果自动生成以下变量变量名内容示例LinuxGIO_FOUND1GIO_INCLUDE_DIRS/usr/include/gio-unix-2.0;/usr/include/glib-2.0;...GIO_LIBRARY_DIRS/usr/lib/x86_64-linux-gnuGIO_LIBRARIESgio-2.0;gobject-2.0;glib-2.0GIO_CFLAGS_OTHER-DGLIB_VERSION_...等额外编译标志install安装可执行文件install(TARGETS target [CONFIGURATIONS config...] DESTINATION dir)描述将编译出来的可执行文件target安装到目录dir中安装文件
CMake学习记录
发布时间:2026/7/1 22:35:15
CMake学习记录宏macro (do_test arg1 arg2 result)add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})set_tests_properties (test_${arg1}_${arg2}PROPERTIES PASS_REGULAR_EXPRESSION ${result})endmacro (do_test)描述macro(宏名 参数列表)可以定义一个宏第一个参数宏名其余参数在宏当中使用的变量名示例作用定义一个宏简化测试代码的编写add_test用于添加一个测试条件语句if语句if(condition)Tab...else()Tab...endif(condition)常用指令add_definitionsadd_definitions(-DFOO -DBAR123)描述add_definitions是 CMake 中用来 **批量向所有目标可执行文件、库添加编译宏定义**-D选项的命令。实际传给编译器含义-DFOO定义宏FOO空值-DBAR123定义宏BAR为123相当于添加了#define FOO#define BAR 123add_libraryadd_library(function STATICsrc/hello.cpp)描述使用一些源文件生成库第一个参数库名实际生成的名字为libfunction.xxx第二个参数决定生成的库是动态库还是静态库没有则默认静态第三个参数生成库的源文件add_excutableadd_executable(Demo ${DIR_SRCS})描述使用一些源文件编译并链接成一个可执行程序add_subdirectoryadd_subdirectory(math)描述将一个子目录添加到构建系统中参数子目录名称示例代码作用将math子目录中的CMakeLists.txt文件解析并加入到构建系统中aux_source_directoryaux_source_directory(dir variable)描述自动获取指定目录中的所有源文件并将这些文件存储到一个变量中configure_fileconfigure_file(${PROJECT_SOURCE_DIR}/config.h.in${PROJECT_BINARY_DIR}/config.h)描述将一个输入文件通常是模板文件配置为输出文件它会根据CMake变量的值替换输入文件模板文件中的占位符生成最终的配置文件第一个参数模板文件通常以.in为后缀第二个参数输出的配置文件注意点模版文件后缀并非强制要求in只是一种约定模版文件需要我们自己预先定义好生成的文件可以是源文件如.h、.c、.cpp等是也可以其他类型的文件如配置文件等execute_processexecute_process(COMMAND git rev-parse HEADWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}OUTPUT_VARIABLE FULL_SHAOUTPUT_STRIP_TRAILING_WHITESPACE)关键字 / 参数含义execute_processCMake 提供的命令用于在配置阶段执行一条或多条外部命令。COMMAND git rev-parse HEAD要执行的命令运行git rev-parse HEAD获取当前 Git 仓库的完整 SHA 哈希值。WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}指定命令的运行目录为项目根目录${CMAKE_SOURCE_DIR}。OUTPUT_VARIABLE FULL_SHA把命令的标准输出stdout保存到 CMake 变量FULL_SHA。OUTPUT_STRIP_TRAILING_WHITESPACE自动去掉输出FULL_SHA末尾的换行符或空格避免后面使用时出现\n。find_packagefind_package(PackageName [version] [REQUIRED] [COMPONENTS c1 c2...])描述find_package是 CMake最重要、最常用的模块查找指令之一用来在系统中“找到”某个第三方库或工具链并自动为你设置头文件目录、库文件目录、库名称等变量省去手动写include_directories()、target_link_libraries()的麻烦。参数说明PackageName模块名大小写不敏感如OpenSSL,Boost,Threads[version]可指定最低版本如3.1.0REQUIRED找不到就报错构建停止COMPONENTS只找其中某些组件如COMPONENTS system filesystem模式描述文件来源Module 模式使用 CMake 自带的FindPackageName.cmake脚本cmake prefix/Modules/Config 模式使用库自己提供的PackageNameConfig.cmake或PackageName-config.cmake库安装目录的lib/cmake/PackageName/CMake 先尝试 Module再尝试 Config。成功后会生成哪些变量以find_package(OpenSSL REQUIRED)为例变量内容OPENSSL_FOUNDTRUEOPENSSL_INCLUDE_DIR/usr/include/opensslOPENSSL_LIBRARIES/usr/lib/libssl.so;/usr/lib/libcrypto.soOPENSSL_VERSION1.1.1w你可以直接用target_include_directories(myapp PRIVATE ${OPENSSL_INCLUDE_DIR})target_link_libraries(myapp PRIVATE ${OPENSSL_LIBRARIES})一个典型用法示例find_package(PkgConfig REQUIRED)pkg_check_modules(GIO REQUIRED gio-unix-2.0)target_include_directories(my_app PRIVATE ${GIO_INCLUDE_DIRS})target_link_libraries (my_app PRIVATE ${GIO_LIBRARIES})find_package(PkgConfig REQUIRED)作用让 CMake 先找到pkg-config这个系统小工具Linux 下通常是/usr/bin/pkg-config。REQUIRED如果系统没装pkg-config立即报错停止。成功后PkgConfig模块会提供pkg_check_modules()命令。pkg_check_modules(GIO REQUIRED gio-unix-2.0)作用等价于在终端执行pkg-config --cflags --libs gio-unix-2.0。结果自动生成以下变量变量名内容示例LinuxGIO_FOUND1GIO_INCLUDE_DIRS/usr/include/gio-unix-2.0;/usr/include/glib-2.0;...GIO_LIBRARY_DIRS/usr/lib/x86_64-linux-gnuGIO_LIBRARIESgio-2.0;gobject-2.0;glib-2.0GIO_CFLAGS_OTHER-DGLIB_VERSION_...等额外编译标志install安装可执行文件install(TARGETS target [CONFIGURATIONS config...] DESTINATION dir)描述将编译出来的可执行文件target安装到目录dir中安装文件