gcc库链接

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

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

 

posted @   张杨  阅读(490)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示