Linux下C调用静态库和动态库,Linux-C动态库与静态库的编译与调用

Linux-C动态库与静态库的编译与调用

一、简述

记录-Linux-C动态库与静态库的编译与调用。将实现某部分功能的代码封装成库文件,以方便调用,或者是对代码进行保护加密。应用场景:有时想将某代码提供给别人用,但是又不想公开源代码,这时可以将代码封装成库文件。在开发中调用其他人员编写的库。

动态库特点:

1,库的代码不会编译进程序里面,所以动态库编译的程序比较小。

2,由动态库编译的程序依赖于系统的环境变量有没有这个库文件,没有则运行不了。

静态库特点:

1,库的代码会编译进程序里面,所以静态库编译的程序比较大

2,由静态库编译的程序不用依赖于系统的环境变量,所以环境变量有没有这个库文件,也可以运行。

二、动态库的编译与调用

1、创建目录:mkdir dynamic;进入dynamic目录:cd dynamic;新建c文件:vi func.c

d6c59f00e9827fcb75b06c9c5d2b41e6.png

2、编辑func.c内容如下,(记得保存)

de9b43987d87202b220261fdd76d51c0.png

3、 将func.c编译为动态库,编译命令:

gcc func.c -o func.o -c -fPIC

gcc func.o -shared -o libfunc.so               (注其中libfunc.so,lib为前缀,.so是后缀,中间func是库的名字)

ed9ed403ad48c14ff36c15036e2f8831.png

4、 在dynamic路径下新建main.c文件:vi main.c;在main.c中调用动态库中的func()函数。

0add1248f1424119ec54aaffbb196a62.png

5、    因为fun.c与main.c在同一路径,避免干扰,删除fun.c,func.o文件;命令:rm func.c func.o

36c4782f636b71209561ab3db0c4d74a.png

6、    编译main.c并调用动态库libfunc.so。命令:gcc main.c -o main -L 库的路径 -l 库名

gcc main.c -o main -L . -l func            (点代表当前路径)

fee71a1b63285466523803fc054b34b8.png

7、   执行main,找不到库

49adafa8d2c5ae5bf814c7babeee49c2.png

8、 需要将动态库拷贝一份到/usr/lib/路径下,命令:sudo cp libfunc.so /usr/lib     (需要超级权限);执行:./main

29747f6d5776e2f755b145edc95de718.png

三、静态库的编译与调用

1、创建目录:mkdir static;进入static目录:cd static;新建c文件:vi func.c

65844581877191b9145010a4401cf639.png

2、编辑func.c内容如下,(记得保存)

da510ca95eb4a5e1c3a471b6675d5aee.png

3、 将func.c编译为静库,编译命令:

gcc func.c -o func.o -c

ar -crv libfunc.a func.o               (注lib为前缀,静态库以.a为后缀,中间部分func为库的名字)

6102e01ff2dbebb10d9baebc08ddf46c.png

4、 在static路径下新建main.c文件:vi main.c;在main.c中调用静态库中的func()函数。

c38da87332d081b0216d575955f961d0.png

5、    因为fun.c与main.c在同一路径,避免干扰,删除fun.c,func.o文件;命令:rm func.c func.o

918f9206954fe8ec0bc6cfd2b3823e5a.png

6、 编译main.c并调用静态库libfunc.so。命令:gcc main.c -o main -L 库的路径 -l 库名

gcc main.c -o main -L . -l func            (点代表当前路径)

9ce5c85a91315fffd134361381090197.png

7、执行:./main          (不需要将静态库拷贝到/usr/lib/)

b60cf7045c19d2b7dfaf47340f604c9b.png

四、静态编译

我们通常用的是动态编译,比如说调用标准库的printf()函数,printf()的代码不会直接全部的编译到可执行文件,而是相当于在可执行程序中链接调用printf()函数。这样可执行文件的大小就不会很大,但是可执行程序的运行环境必需要含有其所需要的库文件等。静态编译,就是将程序所调用到的代码全部编译到可执行文件,所以编译出来的可执行文件比较大,但是它无需过多依赖运行环境。

比如在桌面创建hello.c;命令:vi hello.c 。编辑内容如图

abfdcf37d0ee2182368b071bb2d355c3.png

动态编译:gcc hello.c -o hello_dynamic          静态编译:gcc hello.c -o hello_static -static

7ff9c298334426abdac4dffcd777a200.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值