C++静态库是将编译后的目标文件(.obj/.o)打包成归档文件(Windows为.lib,Linux/macOS为.a),仅提供已编译符号定义;需分离头文件与实现、只编译不链接、再用ar/lib工具打包,最后在链接时指定头文件路径、库路径及库名。
在C++中创建静态库,本质是把编译后的目标文件(.obj 或 .o)打包成一个归档文件(Windows下为 .lib,Linux/macOS下为 .a),供其他程序链接时使用。它不包含运行时逻辑,只提供已编译的符号定义。
静态库需要清晰分离接口与实现:
#pragma once 或卫士宏防止重复包含main() 函数,也不依赖未提供的第三方动态库关键:只编译,不链接。禁用运行时库自动链接(尤其Windows),避免引入不必要的依赖。
cl /c /EHsc /O2 math
_utils.cpp/c 表示只编译)g++ -c -O2 math_utils.cpp-c 表示只编译)用归档工具把目标文件“压缩”成库,不进行任何代码变换。
lib math_utils.obj /OUT:math_utils.libar rcs libmath_utils.a math_utils.or=插入,c=静默创建,s=生成索引)libtool -static -o libmath_utils.a math_utils.oar(行为与Linux基本一致)使用时需同时提供头文件路径、库文件路径和库名,由链接器在编译末期解析符号。
cl main.cpp /I. /link math_utils.lib/I. 告诉编译器在当前目录找头文件)g++ main.cpp -I. -L. -lmath_utils -o main-L. 指定库路径,-lmath_utils 自动匹配 libmath_utils.a)/OPT:NOREF 或 --no-as-needed 可强制保留)基本上就这些。核心就是“先编译出 .o/.obj,再用 ar/lib 打包”,不复杂但容易忽略 -c 和路径配置细节。