.so文件需要main函数吗_Linux库函数制作(静态库、动态库)

gcc常用编译应用实例:

例1:

gcc -E hello.c -o hello.i 预编译

gcc -S hello.i -o hello.s 编译

gcc -c hello.s -o hello.o 汇编

gcc hello.o -o hello_elf 链接

例2:

gcc hello.c -o hello_elf

静态库与动态库

链接方式

链接分为两种:静态链接、动态链接

静态链接:

由链接器在链接时将库的内容加入到可执行程序中

静态链接的特点是:

优点:

对运行环境的依赖性较小,具有较好的兼容性

缺点:

生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间

库函数有了更新,必须重新编译应用程序

动态链接:

连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序

动态链接的特点:

优点:

在需要的时候才会调入对应的资源函数

简化程序的升级;有着较小的程序体积

实现进程之间的资源共享(避免重复拷贝)

缺点:

依赖动态库,不能独立运行

动态库依赖版本问题严重

c2c7b671ddc3ee0225cb6ef35a7f2776.png

a7a7b2cdcd62f0701a506e3419dd3615.png

536e6e568df461262b6bcee26f265725.png

54127b1c84c5b03b51e6d25ab8d55611.png

d32be4e47f560104cb6ec0a3f53b81a4.png

动态链接库的使用2:

1.库函数、头文件均在系统路径下

#cp libtestlib.so /lib

#gcc mytest.c -o mytest -ltestlib

#./mytest

编译运行都不会出错

问题:有个问题出现了?

我们前面的静态库也是放在/lib下,那么连接的到底是动态库还是静态库呢?

当静态库与动态库重名时,系统会优先连接动态库,或者我们可以加入-static指定使用静态库

示例:

3321d4914be752f991f61ca2449a79db.png

gcc main_grade.c fun_grade.c -o grade_elf -static // 静态编译可执行文件

gcc main_grade.c fun_grade.c -o grade_elf // 默认动态编译可执行文件

6f3eee043d9da8024a49d7b6e0f9db86.png

静态库编译可执行文件

gcc -c ./src/fun_grade.c -o ./lib/fun_grade.o

ar rc ./lib/libfun_grade.a ./lib/fun_grade.o

gcc ./src/main_grade.c -o grade_elf -L./lib/ -lfun_grade-I./inc/

2f8c1334d6fb7b00eebffb2da148791c.png

动态库编译可执行文件

gcc -shared ./src/fun_grade.c -o ./lib/libfun_grade.so

gcc ./src/main_grade.c -o grade_elf -L./lib/ -lfun_grade -I./inc/

e69ff6aad6d1bf3390f233eaf063e091.png

7248639321ab6c02f7e76022d91910c9.png

解决无法打开动态库的常用简便方法:

声明临时变量环境

export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH

或者修改 /etc/ld.so.conf 文件 在其中添加库的搜索路径,一行一个路径。

sudo ldconfig 更新 /etc/ld.so.cache 文件

那 ./etc/ld.so.conf 中所有路径的库文件都被缓存达到 /etc/ld.so.cache 中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值