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


写一个C语言代码,实现三个整数的求平均数和求和操作,main函数中包含对求平均数和求和函数的调用,求平均数和求和函数分别放置在和main函数不同的文件中。
1. 在宿主机客户端输入命令:gedit 源文件名.c ,在打开的文件中编写C程序源代码。
2. 使用arm-linux-gcc编译器编译源程序
3. 将求平均数和求和函数生成支持6410开发板的静态库
4. 使用静态库生成可执行文件,并在开发板上执行
5. 将求平均数和求和函数生成支持6410开发板的动态库
6. 使用动态库生成可执行文件,并在开发板上执行
7. 在开发板上运行程序,命令如下:./目标文件名

多文件实现三个整数的平均数和求和的操作。
main.c

//main.c
#include <stdio.h>
#include "a.h"
int main()
{
    int a,b,c;
    float avg;
    int sum;
    printf("请输入三个整数,以空格隔开:\n");
    scanf("%d %d %d",&a,&b,&c);
    avg=myavg(a,b,c);   
    printf("the average is: %5.2f\n",avg);
    sum=mysum(a,b,c);
    printf("the sum is:%d\n",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)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com