1.库的分类
库有静态库和动态库,linux下静态库为.a,动态库为.so。windows下静态库为.lib,动态库为.dll。
静态库是在编译的链接阶段链接嵌入到程序中。因此链接了静态库的程序之后与静态库没有了关系,你如果更新了静态库,使用静态库的程序需要重新链接。
动态库在在运行阶段加载的,不会链接到使用动态库的程序中。有点是一旦修改了动态库,所有使用动态库的程序都会自动加载,无需再次编译。
2.库的生成
下面命令在linux环境下执行,以test.c举例
动态库的生成
gcc -share test.c -o libtest.so
静态库的生成
由于静态库是在链接阶段链接的,因此静态库实际上就是编译阶段的.o目标文件的归档文件
gcc -c test.c会生成test.o
ar -r libtest.a test.o
可以将多个.o文件打包到一个库中
3.库的加载
gcc默认会在/lib 和/user/lib下查找库
比如test.c会使用到加密库中的函数
gcc test.c -lcrypto -o test
gcc会自动到/lib和/usr/lib路径下查找libcrypto.a或者libcrypto.so
当库不在/lib和 /usr/lib路径下时,需要手动指定库链接
可以使用-L,比如在当前路径下查找库
gcc test.c -L. -lcrypto -o test
另外程序链接库时如果没有使用-static选项,一般会优先使用动态库。
要加载静态库需要使用-static选项
gcc test.c -lcrypto -static -o teststatic
明显可以看到teststatic比test要大很多。
因为静态库会链接到程序中。