欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

gcc库链接

程序员文章站 2022-04-19 18:49:43
转载于https://blog.csdn.net/zhangdaisylove/article/details/45721667 1.库的分类 库有静态库和动态库,linux下静态库为.a,动态库为.so。windows下静态库为.lib,动态库为.dll。 静态库是在编译的链接阶段链接嵌入到程序中 ......

转载于https://blog.csdn.net/zhangdaisylove/article/details/45721667

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要大很多。

因为静态库会链接到程序中。