ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

虚拟机Ubuntu静态库和动态库的编程

2020-03-22 10:57:00  阅读:272  来源: 互联网

标签:gcc cal 21 testcal Pow 虚拟机 编程 Ubuntu ljp


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静态库和动态库的操作流程编程,到此收尾。

谢谢观看。

标签:gcc,cal,21,testcal,Pow,虚拟机,编程,Ubuntu,ljp
来源: https://www.cnblogs.com/liujipeng/p/12544258.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有