直接用add_library声明static类型即可生成静态库,无需额外开关;头文件路径须用target_include_directories(public)显式暴露;链接时依赖顺序必须从左到右满足符号引用关系。

直接用 add_library 声明 STATIC 类型目标,就能生成静态库——不需要额外开关或全局设置。
add_library 里必须显式写 STATIC
CMake 默认行为受 BUILD_SHARED_LIBS 控制,但这个变量只影响未指定类型的 add_library 调用。一旦你明确写了 STATIC,就和它无关了。
-
add_library(mylib STATIC src/a.cpp src/b.cpp)→ 生成libmylib.a(Linux/macOS)或mylib.lib(Windows) -
add_library(mylib SHARED ...)→ 动态库,和本文无关 -
add_library(mylib ...)(没写类型)→ 依赖BUILD_SHARED_LIBS,不可靠,别这么写
头文件路径必须用 target_include_directories 显式暴露
静态库本身不带头文件路径,target_link_libraries 不会自动把它的头文件加进编译命令。如果你的库提供公共头文件,得手动告诉使用者在哪找。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 在定义静态库的目标时,用
target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) -
PUBLIC表示:链接该库的其他目标,也会自动获得这个头文件路径 - 别用
include_directories()全局设置,它污染整个目录作用域,且无法随目标传递
链接静态库时顺序不能错,尤其多个静态库互相依赖
链接器从左到右解析符号,如果 libA.a 调用了 libB.a 里的函数,那么 libA 必须写在 libB 左边,否则报 undefined reference。
-
target_link_libraries(myapp PRIVATE libA libB)→ 正确(假设 A 依赖 B) -
target_link_libraries(myapp PRIVATE libB libA)→ 链接失败 - 用
nm -C libB.a | grep some_func确认符号确实存在,避免空猜依赖方向 - Windows 下注意区分
.lib:静态库是归档格式,导入库(import library)是动态链接用的,别混用
最容易被忽略的是:静态库目标本身不传播头文件路径,哪怕你用了 target_include_directories,也得确保调用方通过 target_link_libraries 正确链接该目标——而不是直接传 .a 文件路径。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










