gcc與gdb工具使用,靜態庫與動態庫的構建與使用

1.gcc命令的常用選項:

1)列出這些常用選項的作用:

選項 功能
-o [file] 指定生成的輸出文件名爲file
-E 只進行預處理
-S 只進行預處理和編譯
-c 只進行預處理,編譯和彙編
-Wall 生成所有級別的警告信息
-w 關閉所有警告
-O[0-3] 指定編譯器優化級別,0爲不優化;3優化等級最高
-include [file] 包含一個文件,等同於代碼中的#include
-D[key]=[value] 添加宏替換,等同於#define key value,若省略def,則表示替換爲1
-U[key] 取消宏定義,等同於#undef key
-v 顯示製作GCC工具時的配置命令,顯示預處理器,編譯器的版本號
-I[dir] (大寫i)將dir目錄加入頭文件搜索目錄列表/優先在dir目錄中查找頭文件
-L[dir] 將dir目錄加入庫文件搜索目錄列表/優先在dir目錄中查找庫文件
-l[name] (小寫L)鏈接名爲name的庫
-static 鏈接時使用靜態庫
-shared 編譯動態庫
-g 在可執行文件中加入標準調試信息

2)使用這些選項編譯程序:

目錄結構:

hello.c

include|->hello.h

代碼:

//hello.h
#include<stdio.h>
//hell.c
#include"hello.h"
int main(){
    printf("hello\n");
    return 0;
}

運行截圖:

在這裏插入圖片描述

2.分析靜態鏈接庫與動態鏈接庫各自的優缺點

靜態鏈接庫:

  • 優點:
    • 對運行環境的依賴性較小,具有較好的兼容性
  • 缺點:
    • 生成的程序比較大,需要更多系統資源,在裝入內存時會消耗更多的時間
    • 庫函數有了更新,必須重新編譯應用程序

動態鏈接庫

  • 優點:
    • 在需要的時候猜會調入對應的資源函數
    • 簡化程序的升級;有較小的程序體積
    • 實現進程之間的資源共享(避免重複拷貝)
  • 缺點:
    • 以來動態庫,不能獨立運行
    • 動態庫依賴版本問題嚴重

3.靜態鏈接庫與動態鏈接庫的創建方法和使用方法

測試代碼:

//mylib.h
extern int add(int x, int y);
extern int sub(int x, int y);
//mylib.c
int add(int x, int y){
    return x+y;
}
int sub(int x, int y){
    return x-y;
}
//mytest.c
#include<stdio.h>
#include"mylib.h"

int main(){
    int a=20, b=10, sum, diff;
    sum = add(a, b);
    diff = sub(a,b);
    printf("sum=%d\n", sum);
    printf("diff=%d\n", diff);
}

靜態鏈接庫的創建:

gcc -c mylib.c -o mylib.o
ar rc libmylib.a mylib.o

靜態鏈接庫的使用:

gcc -o mytest mytest.c libmylib.a

gcc -o mytest mytest.c -L/opt -lmylib -I/opt

運行截圖:

在這裏插入圖片描述

動態鏈接庫的創建:

gcc -shared mylib.c -o libmylib.so

動態鏈接庫的使用:

gcc -o mytest mytest.c ./libmylib.so

gcc -o mytest mytest.c -L./opt -lmylib -I./opt

運行截圖:

在這裏插入圖片描述
在這裏插入圖片描述

4.gdb調試程序截圖(練習:列出程序清單、運行程序、設置斷點、清除斷點、顯示程序變量值、單步執行)

測試代碼:

//gdbtest.c
#include<stdio.h>


int sum(int m);
int main(){
    int i, n=0;
    sum(50);
    for(i=1;i<=50;++i){
        n+=i;
    }
    printf("The sum of 1-50 is %d \n", n);
    return 0;
}
int sum(int m){
    int i,n=0;
    for(i=1;i<=m;++i)
        n+=i;
    printf("The sum of 1-m is %d\n", n);
}


編譯:

gcc -g gdbtest.c -o gdbtest

測試截圖:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章