差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
| public:it:cmake [2020/11/09 13:50] – 创建 oakfire | public:it:cmake [2024/09/03 14:06] (当前版本) – [CMake] oakfire | ||
|---|---|---|---|
| 行 2: | 行 2: | ||
| * Official Site: | * Official Site: | ||
| * c++跨平台构建工具, | * c++跨平台构建工具, | ||
| + | * CMake [[https:// | ||
| + | * CMake 变量的作用域:[[https:// | ||
| + | * 父目录里的绑定变量默认会传到子目录的CMakefile作为初始值 | ||
| + | * find_package 默认支持的列表:'' | ||
| ===== Tips ===== | ===== Tips ===== | ||
| * MSVC中, cmake 默认生成的 release 工程不生成 pdb 文件,可如下添加< | * MSVC中, cmake 默认生成的 release 工程不生成 pdb 文件,可如下添加< | ||
| 行 13: | 行 16: | ||
| # if build static .lib | # if build static .lib | ||
| set(CMAKE_STATIC_LINKER_FLAGS_RELEASE " | set(CMAKE_STATIC_LINKER_FLAGS_RELEASE " | ||
| - | else (MSVC) | ||
| endif (MSVC) | endif (MSVC) | ||
| - | </ | + | </ |
| + | target_compile_options(${YourProjName} | ||
| + | PRIVATE " | ||
| + | ) | ||
| + | target_link_options(${YourProjName} | ||
| + | PRIVATE " | ||
| + | PRIVATE " | ||
| + | PRIVATE " | ||
| + | ) | ||
| + | </ | ||
| + | * 给dll右键属性的详细信息里添加git version, 参考[[https:// | ||
| + | add_definitions(-DMAIN_PROJECT_NAME=\" | ||
| + | find_package(Git QUIET) | ||
| + | if(GIT_FOUND) | ||
| + | set(COMMIT_HASH "" | ||
| + | set(BRANCH_NAME "" | ||
| + | execute_process( | ||
| + | COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format: | ||
| + | OUTPUT_VARIABLE COMMIT_HASH | ||
| + | OUTPUT_STRIP_TRAILING_WHITESPACE | ||
| + | ERROR_QUIET | ||
| + | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | ||
| + | ) | ||
| + | execute_process( | ||
| + | COMMAND ${GIT_EXECUTABLE} symbolic-ref --short -q HEAD | ||
| + | OUTPUT_VARIABLE BRANCH_NAME | ||
| + | OUTPUT_STRIP_TRAILING_WHITESPACE | ||
| + | ERROR_QUIET | ||
| + | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | ||
| + | ) | ||
| + | message(STATUS "Git version is ${BRANCH_NAME}: | ||
| + | add_definitions(-DGIT_COMMIT_HASH=\" | ||
| + | add_definitions(-DGIT_BRANCH_NAME=\" | ||
| + | endif() | ||
| + | </ | ||
| + | |||
| + | #if (defined GIT_COMMIT_HASH && defined GIT_BRANCH_NAME) | ||
| + | #define PRODUCT_VERSION GIT_BRANCH_NAME ":" | ||
| + | #else | ||
| + | #define PRODUCT_VERSION " | ||
| + | #endif // GIT_COMMIT_HASH && GIT_BRANCH_NAME | ||
| + | |||
| + | #ifndef MAIN_PROJECT_NAME | ||
| + | #define MAIN_PROJECT_NAME " | ||
| + | #endif | ||
| + | |||
| + | 1 VERSIONINFO | ||
| + | FILEVERSION 1,0,0,1 | ||
| + | PRODUCTVERSION 1,0,0,1 | ||
| + | FILEFLAGSMASK 0x17L | ||
| + | #ifdef _DEBUG | ||
| + | FILEFLAGS 0x1L | ||
| + | #else | ||
| + | FILEFLAGS 0x0L | ||
| + | #endif | ||
| + | FILEOS 0x4L | ||
| + | FILETYPE 0x0L | ||
| + | FILESUBTYPE 0x0L | ||
| + | BEGIN | ||
| + | BLOCK " | ||
| + | BEGIN | ||
| + | BLOCK " | ||
| + | BEGIN | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | VALUE " | ||
| + | END | ||
| + | END | ||
| + | BLOCK " | ||
| + | BEGIN | ||
| + | VALUE " | ||
| + | END | ||
| + | END | ||
| + | </ | ||
| + | * 循环子文件夹来包含子工程,参考 [[https:// | ||
| + | MACRO(SUBDIRLIST result curdir) | ||
| + | FILE(GLOB children RELATIVE ${curdir} ${curdir}/ | ||
| + | SET(dirlist "" | ||
| + | FOREACH(child ${children}) | ||
| + | IF(IS_DIRECTORY ${curdir}/ | ||
| + | LIST(APPEND dirlist ${child}) | ||
| + | ENDIF() | ||
| + | ENDFOREACH() | ||
| + | SET(${result} ${dirlist}) | ||
| + | ENDMACRO() | ||
| + | |||
| + | SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR}) | ||
| + | |||
| + | message(STATUS "valid subdirs: ${SUBDIRS}" | ||
| + | |||
| + | FOREACH(subdir ${SUBDIRS}) | ||
| + | ADD_SUBDIRECTORY(${subdir}) | ||
| + | ENDFOREACH() | ||
| + | </ | ||
| + | * 在 bat 批处理里面,如果cmake命令行报错,参考[[https:// | ||
| + | cmake . | ||
| + | if errorlevel 1 exit /B | ||
| + | </ | ||
| + | * 屏蔽VC编译 release 时的具体某个 warning,比如c4566, | ||
| + | add_compile_options(" | ||
| + | </ | ||
| + | * cmake 不支持静态库的 dependence, 本质上,静态库只有二进制的合并,没有 link, 只有MSVC可以加 静态库的dependence然后生成合并后的lib, | ||
| + | add_library(a STATIC | ||
| + | # target_link_libraries(a b) # 这是不起作用的,因为 a 是静态库,没有link | ||
| + | add_library(ab INTERFACE) # 增加一个 ab, INTERFACE | ||
| + | target_link_libraries(ab INTERFACE a b) | ||
| + | add_executable(c ...) | ||
| + | target_link_libraries(c ab) # 此时 c 工程就包含了a.lib, | ||
| + | </ | ||
| + | * [[https:// | ||
| + | * 如果源文件包含该第三方头文件,但头文件中不包含该第三方头文件,采用 PRIVATE; | ||
| + | * 如果源文件和头文件中都包含该第三方头文件,采用 PUBLIC; | ||
| + | * 如果头文件中包含该第三方头文件,但源文件中不包含,采用 INTERFACE。 | ||