首页 / 虚拟机 / 虚拟机Ubuntu静态库和动态库的编程
虚拟机Ubuntu静态库和动态库的编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了虚拟机Ubuntu静态库和动态库的编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4555字,纯文字阅读大概需要7分钟。
内容图文
![虚拟机Ubuntu静态库和动态库的编程](/upload/InfoBanner/zyjiaocheng/940/79dde36488e24c5fa6581c512b0472c9.jpg)
2020-03-22
一、不用库去执行,使用Makefile去实现。代码testcal.c Pow.c Pow.o cal.h。
Pow.c
1 int Pow (int x ,int y){ 2 int result=1; 3 int i=0; 4 for(i=0;i<y;i++) 5 { 6 result *=x; 7 } 8 9 10 return result ; 11 }
cal.h
#ifndef cal_h #define cal_h int Pow(int, int); #endif
testcal.c
1 #include<stdio.h> 2 #include<math.h> 3 #include "cal.h" 4 int main (int argc, char **argv) 5 { 6 int x; 7 int y; 8 printf("please input the x:"); 9 scanf("%d",&x); 10 printf("please input the y:"); 11 scanf("%d",&y); 12 13 printf("result=%d",Pow(x,y)); 14 return 0; 15 }
这是附加文件Makefile,文件名就为Makefile。
1 OBJ=testcal.o Pow.o 2 testcal:$(OBJ) cal.h 3 gcc $(OBJ) -o testcal 4 testcai.o:testcai.c 5 Pow.o:Pow.c 6 7 8 .PHONY:cleanA clean 9 cleanA: 10 rm testcal $(OBJ) 11 12 13 clean: 14 rm $(OBJ)
make
1 cc -c -o testcal.o testcai.c 2 cc -c -o Pow.o Pow.c 3 gcc -o testcal testcal.c Pow.o
查看文件大小
命令: ls -l 1 总用量 48 2 -rw-r--r-- 1 ljp ljp 57 3月 21 21:08 cal.h 3 -rw-r--r-- 1 ljp ljp 1412 3月 21 21:57 libljp.a 4 drwxr-xr-x 2 ljp ljp 4096 3月 21 22:01 libsamp 5 drwxr-xr-x 2 ljp ljp 4096 3月 21 22:31 libso 6 -rw-r--r-- 1 ljp ljp 171 3月 22 09:34 Makefile 7 -rw-r--r-- 1 ljp ljp 101 3月 21 21:28 Pow.c 8 -rw-r--r-- 1 ljp ljp 1272 3月 21 21:48 Pow.o 9 -rwxr-xr-x 1 ljp ljp 8464 3月 21 21:48 testcal 10 -rw-r--r-- 1 ljp ljp 279 3月 21 21:32 testcal.c 11 -rw-r--r-- 1 ljp ljp 2088 3月 21 21:48 testcal.o
从上可以看出形成的可执行文件为8464字节,大概8k左右
运行结果如下
命令:./testcal
1 please input the x:2 2 please input the y:3 3 result=8
二、使用静态库。
库文件一般以lib为前缀,紧接着是库名称本文库名ljp,扩展名为.a,例如我们这里要创建库名libljp.a的库,使用命令ar,具体如下:
ar rcs libljp.a Pow.o
使用静态库,创建库文件的接口文件头文件,本文是cal.h文件,使用库文件testcal.c包含头文件cal.h文件即可,使用gcc命令编译:
gcc -o testCal testCal.c -static -L. -lljp
其中上边命令的说明:
(1)、gcc -o testCal:使用gcc编译,-o指定文件名,后边的testCal就是最终生成的文件名
(2)、-static:指明使用静态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lcal:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边的cal才是真正的库文件名称,后缀名是不需要的
查看文件的大小
总用量 948 -rw-r--r-- 1 ljp ljp 57 3月 21 21:59 cal.h -rw-r--r-- 1 ljp ljp 1412 3月 21 21:59 libljp.a -rwxr-xr-x 1 ljp ljp 958320 3月 21 22:01 testcal -rw-r--r-- 1 ljp ljp 279 3月 21 21:59 testcal.c
可以很明显看出:使用静态库文件的可执行文件的大小为958320字节,超过900k字节
执行可执行文件,用命令./testcal
1 please input the x:2 2 please input the y:4 3 result=16
三、使用动态库文件:生成动态库文件。
库文件一般以lib为前缀,紧接着是库的名称,扩展名为.so,例如我们这里要创建库名libcal.so的库,如下:
先运行make命令,通过makefile文件生成目标文件testCal.o Pow.o,接着使用下面命令:
gcc -shared -fPIC -o libcal.so Pow.o
其中上边命令的说明:
(1)、gcc -o libcal.so:使用gcc编译,-o指定文件名,后边的libcal.so就是最终生成的动态库名
(2)、-shared:指明生成动态库
(3)、-fPIC.:该选项告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,运行时进行地址链接
gcc -o testCal testCal.c -L. -lcal
其中上边命令的说明:
(1)、gcc -o testCal:使用gcc编译,-o指定文件名,后边的libcal.so就是最终生成可执行文件名称
(2)、没有使用-static:指明使用动态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lcal:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边的cal才是真正的库文件名称,后缀名是不需要的
查看文件大小:
总用量 32 -rw-r--r-- 1 ljp ljp 57 3月 21 22:07 cal.h -rwxr-xr-x 1 ljp ljp 7432 3月 21 22:24 libcla.so -rw-r--r-- 1 ljp ljp 1272 3月 21 22:06 Pow.o -rwxr-xr-x 1 ljp ljp 8432 3月 21 22:31 testcal -rw-r--r-- 1 ljp ljp 279 3月 21 22:07 testcal.c
可以很明显看出:使用动态库文件的可执行文件的大小为8432字节,超过8k字节,比不打包成库大了一点,多了链接信息,比静态库小了很多,差不多只有静态库的1%大小。
接下来执行可执行文件,命令./testcal
./testcal: error while loading shared libraries: libcla.so: cannot open shared object file: No such file or directory
以上表示出现了问题,无法正常使用
连接器会搜索LD_LIBRARY_PATH指定的目录,将该环境变量设置为当前目录,具体命令为:
export LD_LIBRARY_PATH=$(pwd)
再执行可执行文件,命令./testcal
1 please input the x:2 2 please input the y:5 3 result=32
可见正常运行了。
从使用静态库和动态库可见都有各自的优缺点,
静态库:缺点是可执行文件存储量大,静态库可能会重复应用,浪费空间。优点是相对动态库要稳定。
动态库:缺点在目录下不稳定。优点是更容易引用使用,只需要一份库实现多个文件的共享使用。
以上就是虚拟机下Ubuntu静态库和动态库的操作流程编程,到此收尾。
谢谢观看。
内容总结
以上是互联网集市为您收集整理的虚拟机Ubuntu静态库和动态库的编程全部内容,希望文章能够帮你解决虚拟机Ubuntu静态库和动态库的编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。