嵌入式动静态库生成与使用

2019-07-13 02:32发布

写一个C语言代码,实现三个整数的求平均数和求和操作,main函数中包含对求平均数和求和函数的调用,求平均数和求和函数分别放置在和main函数不同的文件中。
1. 在宿主机客户端输入命令:gedit 源文件名.c ,在打开的文件中编写C程序源代码。
2. 使用arm-linux-gcc编译器编译源程序
3. 将求平均数和求和函数生成支持6410开发板的静态库
4. 使用静态库生成可执行文件,并在开发板上执行
5. 将求平均数和求和函数生成支持6410开发板的动态库
6. 使用动态库生成可执行文件,并在开发板上执行
7. 在开发板上运行程序,命令如下:./目标文件名 多文件实现三个整数的平均数和求和的操作。
main.c //main.c #include #include "a.h" int main() { int a,b,c; float avg; int sum; printf("请输入三个整数,以空格隔开: "); scanf("%d %d %d",&a,&b,&c); avg=myavg(a,b,c); printf("the average is: %5.2f ",avg); sum=mysum(a,b,c); printf("the sum is:%d ",sum); return 0; } mysum.c //mysum.c int mysum(int a,int b,int c) { return a + b + c; } myavg.c //myavg.c float myavg(int a,int b,int c){ float avg; avg=(float)(a+b+c)/3; return avg; } a.h //a.h float myavg(int a,int b,int c); int mysum(int a,int b,int c); 在linux下
常规编译gcc mysum.c -o mysum.o -c
~ gcc myavg.c -o myavg.o -c
~gcc main.c -o main.o -c
或者gcc *.c -c 将文件夹中所有的.c文件变为.o文件
静态编译ar
~ar -rv libtest.a myavg.o mysum.o
~gcc main.c -o main -L ./ -ltest
~./main
动态编译
~gcc myavg.o mysum.o -o libtt.so -shared
~vim ~/.bashrc
~gcc main.c -o main2 -L ./-ltt
~./main
——————————————静态编译——————————————
  • ~gcc mysum.c myavg.c -c 将文件变为 .o文件
  • 首先ar -r libtest.a myavg.o mysum.o (将myavg.o mysum.o 归档到libtest.a中生成静态库文件)
  • 然后看ar -t libtest.a 进行『查看』是否成功存在myavg.o mysum.o
  • 然后gcc main .c -o main -L ./ -ltest 进行连接形成可执行文件main
  • ./main 如下图显示
静态编译
———————————————动态编译—————————————–
  • ~gcc mysum.c myavg.c -c 将文件变为 .o文件
  • 首先gcc myavg.o mysum.o -o libtest.so -shared;(生成libtest.so动态库)
  • 然后用vim ~/.bashrc 中修改环境变量export LD_LIBRARY_PATH=./:$ LD_LIBRARY_PATH (./指当前路径,通常是库文件所在路径)
  • 然后进行source ~/.bashrc
动态编译
结论:
将执行文件放到其他的文件夹中发现
静态所得到的main 执行文件可以执行
动态所得到的main2执行文件不能执行
  1. 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
     
  2. 静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。