一個用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.ispa
2,生成彙編代碼調試
gcc -S helloworld.i -o helloworld.scode
3,編譯彙編blog
gcc -c helloworld.s -o helloworld.o編譯器
4,連接io
gcc helloworld.o -o helloworld編譯
一般寫完程序,咱們用 gcc helloworld.c -o helloworld 直接完成以上四個步驟class
1. -o output_filename
肯定可執行文件的名稱爲output_filename。若是不給出這個選項,gcc就給出預設的可執行文件名a.out。
2. -c
只編譯,不連接成爲可執行文件,編譯器只是由輸入的.c等源文件生成.o爲後綴的目標文件。
3. -g
產生調試工具(gdb)所必要的符號信息,要想對編譯出的程序進行調試,就必須加入這個選項。
4. -ldirname
將dirname所指出的目錄加入到程序頭文件目錄列表中。
5. -Ldirname
將dirname所指出的目錄加入到庫文件的目錄列表中。
6. -Wall
生成全部警告信息。
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
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文件,依然能執行,由於靜態庫已經被包含在可執行文件中