gcc編譯器用法,gcc編譯器
一個用c語言寫的程式把他編譯成電腦可執行檔檔案,一般有4個步驟
/*================================================================* Copyright (C) 2018 . All rights reserved.* * 檔案名稱:helloworld.c* 創 建 者:ghostwu(吳華)* 描 述:gcc編譯器用法示範*================================================================*/#include <stdio.h>#define HELLO "hello world!\n"int main(int argc, char *argv[]){ printf( HELLO ); return 0;}
1,預先處理:這個步驟,主要是包含標頭檔,展開宏定義
gcc -E helloworld.c -o helloworld.i
2,產生彙編代碼
gcc -S helloworld.i -o helloworld.s
3,編譯彙編
gcc -c helloworld.s -o helloworld.o
4,連結
gcc helloworld.o -o helloworld
通常寫完程式,我們用 gcc helloworld.c -o helloworld 直接完成以上四個步驟
gcc常用選項含義:
1. -o output_filename
確定可執行檔的名稱為output_filename。如果不給出這個選項,gcc就給出預設的可執行檔名a.out。
2. -c
只編譯,不連結成為可執行檔,編譯器只是由輸入的.c等源檔案產生.o為尾碼的目標檔案。
3. -g
產生調試工具(gdb)所必要的符號資訊,要想對編譯出的程式進行調試,就必須加入這個選項。
4. -ldirname
將dirname所指出的目錄加入到程式標頭檔目錄列表中。
5. -Ldirname
將dirname所指出的目錄加入到庫檔案的目錄列表中。
6. -Wall
產生所有警告資訊。
gcc編譯多個模組
helloworld.h
1 ============================================================== 2 * Copyright (C) 2018 . All rights reserved. 3 * 4 * 檔案名稱:helloworld.h 5 * 創 建 者:ghostwu(吳華) 6 * 描 述: 7 * 8 ================================================================*/ 9 10 #ifndef _HELLO_H_11 #define _HELLO_H_12 void say_hello( const char* name );13 #endif
helloworld.c
/*================================================================* Copyright (C) 2018 . All rights reserved.* * 檔案名稱:helloworld.c* 創 建 者:ghostwu(吳華)*================================================================*/#include <stdio.h>#include "helloworld.h"void say_hello( const char* name ) { printf( "%s\n", name );}
main.c
/*================================================================* Copyright (C) 2018 . All rights reserved.* * 檔案名稱:main.c* 創 建 者:ghostwu(吳華)* 描 述:*================================================================*/#include "helloworld.h"int main(int argc, char *argv[]){ say_hello( "hello ghostwu" ); return 0;}
編譯命令:
gcc helloworld.c main.c -o hello
打包靜態庫(就是一堆通用函數的集合,用.o檔案打包):
1,首先產生.o檔案
gcc -c helloworld.c -o helloworld.o
2,ar rcs libhello.a helloworld.o
r:替換 c:建立 s:儲存
把helloworld打包成 libhello.a靜態庫
3,用靜態庫編譯 產生 可執行檔
gcc -Wall main.c libhello.a -o main
也可以使用l和L 選項
小寫l: 指定庫檔案名稱
大寫的L: 指定庫所在的路徑
gcc -Wall main.c -o main2 -lhello( 這種方式會報錯,在連結庫的時候,沒有用L指定路徑,預設情況下 不會在目前的目錄尋找靜態庫 )
gcc -Wall -L. main.c -o main2 -lhello( L後面跟個. 代表目前的目錄下尋找所連結的庫(libhello.so) ), -lhello: 省略lib和尾碼(.so)
這個時候刪除靜態庫libhello.so,產生的main和main2檔案,依然能執行,因為靜態庫已經被包含在可執行檔中