linux下文件的后缀名只是为了方便程序员知道这是什么类型的文件,不用来识别文件类型。
其中.so文件(shared object)是动态库(共享库),相当于windows下的.dll
.a文件是(archive)归档包(静态库),由多个.o文件打包而来,相当于windows下的.lib
.o文件是源码经过预处理、编译、汇编后的文件,只差链接。
编译过程
源代码 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 目标代码
.c/.cpp .i .s .o .so/.a/.out linux
g++ -E g++ -S g++ -c g++命令
静态库的命名规则和动态库类似为 libxxx.a 即 lib + 库名 + .a
静态库的链接时间:代码编译过程中被载入程序,即生成.o文件后通过链接器生成.out文件
动态库的链接时间:在程序运行到调用动态库的库函数的时候才链接。
动态库的优点是便于升级库,且所有程序只拷贝一份动态库,缺点是运行程序需要有相应的库环境。
生成静态库
1.写一个xxx.cpp和xxx.h以及测试程序test.cpp
2.编译xxx.cpp g++ xxx.cpp -c -o xxx.o
3.生成静态库 ar crv libxxx.a xxx.o (有多个.o文件就加在后面)
4.编译test.cpp并链接静态库 g++ test.cpp -L. -lxxx -o test