生成静态库需两步:先用g++ -c编译源码为.o文件,再用ar rcs命令归档为.a;头文件需单独提供,模板定义须在头文件中,跨工具链应使用extern "C"封装。

用 g++ 编译出 .a 文件需要两步:先编译为对象文件,再归档
静态库本质就是一堆 .o 文件的打包集合,不是直接“编译成 lib”——g++ 没有 -shared 那种一键生成静态库的开关。漏掉中间的 .o 步骤,或者误用 -shared,就会得到动态库或报错。
- 先用
-c编译源码,生成目标文件:g++ -c src/a.cpp src/b.cpp -o a.o b.o - 再用
ar归档(不是 g++):ar rcs libmylib.a a.o b.o -
ar参数含义:r替换/插入,c创建新库(静默),s生成索引(必须加,否则链接时找不到符号)
头文件路径和符号可见性不处理,链接时会报 “undefined reference”
静态库只含二进制代码,不带头文件。调用方必须自己包含对应头文件;同时,C++ 默认所有函数/变量是强符号,但若库中用了内联、模板或匿名命名空间,可能因编译单元隔离导致符号未导出。
- 确保库的公共接口函数**不声明为
static或定义在匿名命名空间里** - 模板类/函数不能只在
.cpp里实现——必须把声明+定义都放在头文件中,否则链接时找不到实例化版本 - 调用方编译时需用
-I/path/to/headers指定头文件位置,链接时用-L/path/to/lib -lmylib
Windows 下用 MinGW 生成 .a 要注意运行时库一致性
MinGW 的 libstdc++ 和 MSVC 的 msvcp140.dll 不兼容。用 MinGW 生成的 .a,只能被同样用 MinGW 编译的程序链接,混用会崩溃或链接失败。
- 检查你的项目是否统一使用 MinGW 工具链:
g++ --version输出含posix或win32可以接受,含msvc则不行 - 避免在库中直接 new/delete 字符串或 vector 并传给 MSVC 程序——分配器不一致会导致内存错误
- 如需跨工具链,改用 C 接口 +
extern "C"封装,绕过 name mangling 和 STL ABI 问题
cmake 构建静态库时,INTERFACE_INCLUDE_DIRECTORIES 容易被忽略
用 CMake 写 add_library(mylib STATIC ...) 很简单,但下游项目 include 头文件时,往往要手动加 -I。CMake 提供了更干净的传递方式,但很多人只设了 target_include_directories 却没分清 PRIVATE/INTERFACE。
立即学习“C++免费学习笔记(深入)”;
- 头文件路径应通过
target_include_directories(mylib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)导出 - 如果写成
PRIVATE,下游target_link_libraries(app mylib)后仍不会自动获得头文件搜索路径 - 验证是否生效:运行
cmake --build build --verbose,看编译 app 时命令行是否含对应-I路径
.a 文件远远不够——得确认调用方“看得见头文件”、“找得到符号”、“用得对运行时”。











