**简 述: ** 起源于 #2 ,发现debug 编译失败,而release 编译成功,根因为默认生成产物和预期不符,故提的一个 PR 。发现与之相关为 CMake 中 CMAKE_BUILD_TYPE
和 BUILD_SHARED_LIBS
的两个变量知识点。
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
💻 win10 21H2
📎 Qt 5.12.11
📎 Visual Studio 2019
BUILD_SHARED_LIBS
是 add_library() 的一个全局标志,当 add_library() 没有指定 [STATIC | SHARED | MODULE]
是哪一个时,可以决定为生成 动态库 还是 静态库。
Typical values:
ON
: 让 add_library() 生成 .dll 动态库,对应 SHAREDOFF
: 让 add_library() 生成 .lib 静态库,对应 STATIC ;默认值
CMake 代码如下,对应生成产物如图:
set(BUILD_SHARED_LIBS ON) # default is OFF
add_library(${PROJECT_NAME} ${SRCS_MAIN})
CMAKE_BUILD_TYPE
指定 生成产物 的构建类型。
Typical values:
Debug
:详细调试信息Release
:无调试信息RelWithDebInfo
:带有调试信息的 Release,依旧可能又略微优化MinSizeRel
:没使用过
总结
对于生成 .dll/.lib 的项目而言:
- 推荐使用 add_library() 时不指定 STATIC | SHARED,而是由 BUILD_SHARED_LIBS 变量来控制。
- 同时又通过自定义宏来决定,生成的 .dll 是采用
__declspec(dllexport)
或__declspec(dllimport)
。
这部分,以及结合如何使用 .dll 后面单独详细讲解一篇。
附: 本篇对应的修改源码在此 CMakeLists.txt
系列地址
欢迎 star
⭐ 和 fork
🍴这个系列的 CMake
学习,附学习由浅入深的目录。