文章出處

編譯多個C源代碼文件

  當程序文件越來越多,修改了其中的一部分代碼文件,我們并不需要全部重新編譯,只需要編譯其中一部分就可以,下面我們創建了一個launch程序,除了主程序,我們創建了3個功能代碼文件reaction.c pitch.c engine.c

1 #include <stdio.h>
2 #include "lac.h"
3 
4 void reaction(){
5     printf("reaction \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3 
4 void pitch(){
5     printf("pitch \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3 
4 void engine(){
5     printf("engine \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3 
4 int main(){
5     reaction();
6     pitch();
7     engine();
8     return 0;
9 }

  首先將源代碼編譯為目標文件

  gcc -c *.c

  *.c會匹配當前目錄下的所有C源文件,-c會告訴編譯器為所有源文件創建目標文件

  然后通過下面的命令,編譯器會過濾掉代碼文件,將目標文件鏈接起來,行程launch程序

  gcc *.o -o launch

  如果我們修改了其中一個文件,只需要編譯修改的文件,然后再將目標文件連接起來,這樣就可以不必編譯所有的文件了

用make工具自動化構建

  那么問題來了,如果修改的文件很多,編譯的時候我們就很難記得修改了哪些文件,當然也可以把所有文件都重新編譯,但是那樣效率很低,有沒有什么辦法讓它自動編譯呢?下面我們就通過make工具自動化構建

  make編譯的文件叫目標,對每個目標它需要知道兩件事情:依賴項(生成文件需要用哪些文件)和生成方法(生成該文件時需要哪些指令);依賴項和生成方法合起來就構成了規則,有了規則,make就知道如何生成目標

  比如,要將reaction.c編譯成目標文件reaction.o;那么reaction.o就是目標,reaction.c是依賴項,生成方法就是將reaction.c轉化為reaction.o的編譯命令 gcc -c reaction.c;創建完目標文件后,我們需要將所有目標文件鏈接在一起,就是通過 gcc *.o -o launch命令,*.o匹配所有目標文件;如果只是需要鏈接一部分目標文件,就需要將要鏈接的目標文件逐個列出來,像這樣: gcc launch.o reaction.o  -o launch

  現在我們就將所有的目標、依賴項和生成方法保存到makefile(或者是Makefile)文件,然后將該文件放在源程序文件同目錄中

 1 launch.o: launch.c lac.h
 2     gcc -c launch.c
 3 reaction.o: lac.h reaction.c
 4     gcc -c reaction.c
 5 pitch.o: lac.h pitch.c
 6     gcc -c pitch.c
 7 engine.o: lac.h engine.c
 8     gcc -c engine.c
 9 launch: launch.o reaction.o pitch.o engine.o
10     gcc *.o -o launch

  需要注意的是,生成方法都是tab開頭

  現在可以打開控制臺開始編譯代碼了;在unix系統中我們可以用make命令,而在windows系統中MinGW版的make寫作 mingw32-make

  當在我們修改了其中一個源代碼文件(pitch.c),重新編譯,你會看到make只編譯了修改的文件

  使用make工具的目的是快速編譯多個源文件程序,如果你寫的只是單個源代碼文件,那就直接編譯來得省事


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()