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
測試截圖: