add_library必须显式指定STATIC才能生成静态库,否则默认创建INTERFACE目标或报错;install需配合ARCHIVE DESTINATION安装归档文件,并同步安装头文件。

add_library 里必须写 STATIC
生成静态库不是靠 install 或 make install 完成的,而是靠 add_library 命令指定类型。漏掉 STATIC 关键字,CMake 默认会建一个 INTERFACE 库(无文件产出)或报错,根本不会生成 .a 或 .lib 文件。
-
add_library(mylib STATIC src/a.cpp src/b.cpp)→ 正确,输出libmylib.a(Linux/macOS)或mylib.lib(Windows) -
add_library(mylib src/a.cpp src/b.cpp)→ 错误,CMake 报错或静默创建 INTERFACE 目标,build/下找不到归档文件 - 即使后续加了
install(TARGETS mylib ARCHIVE DESTINATION lib),目标本身没声明为STATIC,install 就没东西可装
ARCHIVE_OUTPUT_DIRECTORY 决定 .a/.lib 放哪
静态库文件默认输出到 CMAKE_BINARY_DIR 下的 lib/ 子目录(Linux/macOS)或 Release/ 等配置子目录(Windows MSVC),但位置不直观。用 set_target_properties 显式设 ARCHIVE_OUTPUT_DIRECTORY 更可靠:
set_target_properties(mylib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")- 注意:只对
STATIC目标生效;SHARED目标对应LIBRARY_OUTPUT_DIRECTORY,EXECUTABLE对应RUNTIME_OUTPUT_DIRECTORY - 路径建议用
${CMAKE_BINARY_DIR}而非${CMAKE_SOURCE_DIR},避免污染源码树
install(TARGETS ...) 必须带 ARCHIVE DESTINATION
运行 cmake --install 时,如果没在 install(TARGETS ...) 中声明 ARCHIVE DESTINATION,静态库不会被复制到安装目录,哪怕它已在 build 目录生成。
- 正确写法:
install(TARGETS mylib ARCHIVE DESTINATION lib) - 错误写法:
install(TARGETS mylib)→ 静态库被忽略,install后prefix/lib/下空空如也 -
ARCHIVE是静态库专属关键字,不能用LIBRARY(那是给SHARED的),也不能省略 - 安装路径是相对于
CMAKE_INSTALL_PREFIX的,比如CMAKE_INSTALL_PREFIX=/usr/local+DESTINATION lib→ 最终路径是/usr/local/lib/libmylib.a
头文件也要 install,否则别人用不了
只装 .a 文件没用——调用方编译时找不到 #include 的头文件。必须把头文件一并 install(DIRECTORY ...) 或 install(FILES ...):
-
install(DIRECTORY include/ DESTINATION include)→ 把整个include/复制到${CMAKE_INSTALL_PREFIX}/include/ -
install(FILES include/mylib.h DESTINATION include)→ 只装单个头文件 - 若头文件路径通过
target_include_directories(mylib PUBLIC $<INSTALL_INTERFACE:include>)导出,安装后 CMake 依赖方才能自动找到它 - 漏装头文件是最常见的“库装了但编译失败”原因,错误信息通常是
fatal error: mylib.h: No such file or directory
ARCHIVE 关键字的搭配——这两处出错,build 成功但 install 后别人根本链接不了。


















