- gcc 的常用參數
# 編譯時指定所用的頭文件目錄
-I
# 編譯和彙編, 得到一個.o文件 (不鏈接)
-c
# gdb debug 版本
-g
# 在編譯時指定一個宏
-D
# 指定生成二進制文件名 (包括鏈接)
-o
# 添加警告信息
-Wall
# 優化代碼, n是優化等級 (1,2,3)
-On
# 顯示 gcc 的版本
-v --version
- gcc 生成文件表
# C 源文件
.c
# C++ 源文件
.cpp .cc .C
# C/C++ 頭文件
.h
# C 預編譯文件
.i
# C++ 預編譯文件
.ii
# 彙編文件
.s
# 目標文件
.o
# 靜態庫
.a
# 動態庫
.so
- 什麼是庫 ?
庫是方法的集合,將多個方法包含在一個文件裏,那麼這個文件就叫做庫。
- 爲什麼會有庫?
有一些方法需要重複使用,如果下一次使用時,就不需要重新寫一遍,則只需調用這個庫的某個方法即可。
- 有那些庫?
庫分爲靜態庫與動態庫,靜態庫是指編寫程序時載入源文件進行編譯,動態庫是指程序運行時動態載入。
- 製作一個簡單的靜態庫
# 建立源文件與頭文件
touch add.c sub.c mul.c div.c head.h
# 建立 include 目錄並將頭文件移入
mkdir ./include/; mv ./head.h ./include/
# 建立 src 目錄並將這些源文件移入
mkdir ./src/; mv ./*.c ./src/
# 編寫完成後, 編譯生成目標文件
gcc ./src/*.c -c -I ./include/
# 使用 ar 命令生成靜態庫文件
ar rcs libcalc.a ./*.o
- 源文件與頭文件的代碼
/* head.h */
#ifndef _HEAD_H
#define _HEAD_H
#include <stdio.h>
int add(int a, int b);
int sub(int a, int b);
#endif
/* add.c */
#include "head.h"
int add(int a, int b)
{
return a + b;
}
/* sub.c */
#include "head.h"
int sub(int a, int b)
{
return a - b;
}
- 使用生成的靜態庫
# 建立測試源文件並編輯
touch main.c; vim main.c
# 鏈接靜態庫生成可執行文件
gcc main.c -I ./include/ -L . -lcalc -o main
# 運行可執行文件
./main
- 測試源文件
#include "head.h"
int main()
{
int sum = add(1, 1);
printf("sum = %d\n", sum);
}
- 製作一個簡單的動態庫
# 使用 add.o 與 sub.o 目標文件生成動態庫
gcc -shared add.o sub.o -o libcalc1.so
# 參考靜態庫的製作, 編譯測試文件
gcc main.c -I ./include/ -L . -lcalc1 -o main