嵌入式動靜態庫生成與使用


寫一個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