两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 |
public:it:cmake [2020/11/09 14:58] – oakfire | public:it:cmake [2024/09/03 14:06] (当前版本) – [CMake] oakfire |
---|
* Official Site:[[https://cmake.org/|cmake.org]] | * Official Site:[[https://cmake.org/|cmake.org]] |
* c++跨平台构建工具,开源[BSD]免费。 | * c++跨平台构建工具,开源[BSD]免费。 |
| * CMake [[https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html|变量列表]]: |
| * CMake 变量的作用域:[[https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#cmake-language-variables|cmake-language-variables]] |
| * 父目录里的绑定变量默认会传到子目录的CMakefile作为初始值 |
| * find_package 默认支持的列表:''cmake --help-module-list | grep -E ^Find'' |
===== Tips ===== | ===== Tips ===== |
* MSVC中, cmake 默认生成的 release 工程不生成 pdb 文件,可如下添加<code cmake> | * MSVC中, cmake 默认生成的 release 工程不生成 pdb 文件,可如下添加<code cmake> |
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" CACHE STRING "" FORCE) | set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF" CACHE STRING "" FORCE) |
endif (MSVC) | endif (MSVC) |
</code> 参考 [[https://stackoverflow.com/questions/28178978/how-to-generate-pdb-files-for-release-build-with-cmake-flags/31264946|how to generate pdb files...]], 或者使用 [[https://cmake.org/cmake/help/v3.18/manual/cmake-generator-expressions.7.html|cmake generator expressions]]来设置 | </code> 参考 [[https://stackoverflow.com/questions/28178978/how-to-generate-pdb-files-for-release-build-with-cmake-flags/31264946|how to generate pdb files...]], 或者使用 [[https://cmake.org/cmake/help/v3.18/manual/cmake-generator-expressions.7.html|cmake generator expressions]]来设置:<code cmake> |
* 给dll右键属性的详细信息里添加git version<code cmake> | target_compile_options(${YourProjName} |
| PRIVATE "<<AND:<CXXCOMPILERID:MSVC>,<CONFIG:Release>>:/Zi>" |
| ) |
| target_link_options(${YourProjName} |
| PRIVATE "<<AND:<CXXCOMPILERID:MSVC>,<CONFIG:Release>>:/DEBUG>" |
| PRIVATE "<<AND:<CXXCOMPILERID:MSVC>,<CONFIG:Release>>:/OPT:REF>" |
| PRIVATE "<<AND:<CXXCOMPILERID:MSVC>,<CONFIG:Release>>:/OPT:ICF>" |
| ) |
| </code> |
| * 给dll右键属性的详细信息里添加git version, 参考[[https://zhuanlan.zhihu.com/p/97512450|zhihu 97512450]]<code cmake> |
add_definitions(-DMAIN_PROJECT_NAME=\"${YourProjName}\") | add_definitions(-DMAIN_PROJECT_NAME=\"${YourProjName}\") |
find_package(Git QUIET) | find_package(Git QUIET) |
ENDFOREACH() | ENDFOREACH() |
</code> | </code> |
| * 在 bat 批处理里面,如果cmake命令行报错,参考[[https://stackoverflow.com/questions/46709956/how-do-i-handle-cmake-exe-errors|这里]],可加以下一行来进行退出处理<code Winbatch > |
| cmake . |
| if errorlevel 1 exit /B |
| </code> |
| * 屏蔽VC编译 release 时的具体某个 warning,比如c4566, 可用如下,<code cmake> |
| add_compile_options("<<AND:<CXXCOMPILERID:MSVC>,<CONFIG:Release>>:/wd4566>") |
| </code> 注意 ''add_compile_options'' 可影响之后所有target与子项目target, 所以适合在ci(持续集成)时使用。如果只是想具体设置某target, 使用 ''target_compile_options''。另外,不建议开发时屏蔽warning。 |
| * cmake 不支持静态库的 dependence, 本质上,静态库只有二进制的合并,没有 link, 只有MSVC可以加 静态库的dependence然后生成合并后的lib, 但这个其它编译器不一定支持,所以cmake也没有这个选项,如果生成的 a.lib 依赖b.lib, 而 c.exe 依赖 a.lib, 一种不用在 c 的配置中显式增加 b.lib 依赖的写法是利用 ''add_library(<name> INTERFACE)'': <code cmake> |
| add_library(a STATIC ${STRMBASE_FILES}) |
| # 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, b.lib |
| </code> |
| * [[https://stackoverflow.com/questions/26037954/cmake-target-link-libraries-interface-dependencies|target_link_libraries PUBLIC/PRIVATE/INTERFACE 的区别]]:当创建**动态库**时, |
| * 如果源文件包含该第三方头文件,但头文件中不包含该第三方头文件,采用 PRIVATE; |
| * 如果源文件和头文件中都包含该第三方头文件,采用 PUBLIC; |
| * 如果头文件中包含该第三方头文件,但源文件中不包含,采用 INTERFACE。 |
| |