gcc 的使用 # 1

  • 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 

 

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