g 多檔案編譯和簡單MakeFile檔案寫法

2021-06-19 11:51:44 字數 3266 閱讀 3598

上文 (

g++基本用法

)介紹簡單的

g++編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以

makefile

檔案實現,並對

makefile

檔案進行簡單介紹。

準備工作,下面是需要的簡單例項檔案及**:

main.cxx  

administrator@72cec870236147e /home/liujl/mytest

$ cat main.cxx

#include

#include "printf1.hxx"

#include "printf2.hxx"

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c main.cxx

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c printf1.cxx

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c printf2.cxx

int main()

printf1.hxx

administrator@72cec870236147e /home/liujl/mytest

$ cat printf1.hxx

#ifndef _printf_1_h_

#define _printf_1_h_

void printf1();

#endif

printf1.cxx

administrator@72cec870236147e /home/liujl/mytest

$ cat printf1.cxx

#include "printf1.hxx"

#include

using namespace std;

void printf1()

printf2.hxx

administrator@72cec870236147e /home/liujl/mytest

$ cat printf2.hxx

#ifndef _printf_2_h_

#define _printf_2_h_

void printf2();

#endif

printf2.cxx

administrator@72cec870236147e /home/liujl/mytest

$ cat printf2.cxx

#include "printf2.hxx"

#include

using namespace std;

void printf2()

共計5個檔案,3個cxx檔案,2個hxx標頭檔案

1、手動多檔案編譯

①先分別直接彙編(編譯)為.o檔案

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c main.cxx

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c printf1.cxx

administrator@72cec870236147e /home/liujl/mytest

$ g++ -c printf2.cxx

②鏈結階段

如果直接執行

administrator@72cec870236147e /home/liujl/mytest

$ g++ main.cxx -o main

/tmp/cc9lfdvp.o:main.cxx:(.text+0xc): undefined reference to `printf1()'

/tmp/cc9lfdvp.o:main.cxx:(.text+0x11): undefined reference to `printf2()'

collect2: ld 返回1

出現上邊錯誤,原因是編譯器找不到printf1()和printf2()的定義。

所以需要將3個

obj

administrator@72cec870236147e /home/liujl/mytest

$ g++ main.cxx printf1.cxx printf2.cxx -o main

administrator@72cec870236147e /home/liujl/mytest

$ ./main

printf1

printf2

並輸出結果。

這樣就能解決多檔案編譯問題,但是一般情況下,乙個專案下的檔案比較多,如果這樣輸入,比較費勁,所以就需要把編譯過程寫進乙個

makefile

檔案中

administrator@72cec870236147e /home/liujl/mytest

$ cat makefile

cc=g++

exe=main

obj=main.o printf1.o printf2.o

$(exe):$(obj)

$(cc) -o $(exe) $(obj)

main.o:main.cxx

$(cc) -c main.cxx

printf1.o:printf1.cxx

$(cc) -c printf1.cxx

printf2.o:printf2.cxx

$(cc) -c printf2.cxx

clean:

rm -rf *.o main

其中cc=g++

exe=main

obj=main.o printf1.o printf2.o

為變數的定義,$(...)作為引用,可以分析一下,是不是和上文中單個操作效果一樣?

執行過程:

administrator@72cec870236147e /home/liujl/mytest

$ make

g++ -c main.cxx

g++ -c printf1.cxx

g++ -c printf2.cxx

g++ -o main main.o printf1.o printf2.o

makefile

可以參考:1、

a****** makefile tutorial2、

中文makefile教程

g 多檔案編譯和簡單MakeFile檔案寫法

分類 linux相關知識 2013 12 02 16 05 2533人閱讀收藏 舉報 上文 g 基本用法 介紹簡單的 g 編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以 makefile 檔案實現,並對 ma...

(c c )如何編譯簡單編譯多檔案

編譯程式編譯到一定 量時,就會需要將乙個檔案分為多個檔案進行編譯,每個檔案還會對應不同的標頭檔案,這時如果使用多檔案編譯很可能會出現重複定義的問題。問題主要 於兩個方面,一方面是引用標頭檔案時,因為引用的標頭檔案裡還引用其他檔案 另一方面是標頭檔案裡定義了變數,編譯多檔案時都引用了該檔案時就會出現重...

多檔案編譯

編譯多個檔案 編輯兩個檔案 cs 和 class.cs cs using system namespace test class.cs using system namespace test public void saysomething 執行的命令 引數的使用都和單個檔案的執行一樣 如果不指定生...