分類: linux相關知識
2013-12-02 16:05
2533人閱讀收藏
舉報 上文
(g++
基本用法
) 介紹簡單的
g++編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以
makefile
檔案實現,並對
makefile
檔案進行簡單介紹。
準備工作,下面是需要的簡單例項檔案及**:
main.cxx
administrator@72cec870236147e /home/liujl/mytest1、手動多檔案編譯$ 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標頭檔案
①先分別直接彙編(編譯)為.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所以需要將3個obj檔案鏈結到乙個檔案上:$ 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()的定義。
administrator@72cec870236147e /home/liujl/mytest這樣就能解決多檔案編譯問題,但是一般情況下,乙個專案下的檔案比較多,如果這樣輸入,比較費勁,所以就需要把編譯過程寫進乙個makefile檔案中$ g++ main.cxx printf1.cxx printf2.cxx -o main
administrator@72cec870236147e /home/liujl/mytest
$ ./main
printf1
printf2
並輸出結果。
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檔案寫法
上文 g 基本用法 介紹簡單的 g 編譯器的用法,只是針對沒有依賴關係的單個檔案的操作,當我們有多個檔案需要編譯的時候,是如何工作的呢?下面以簡單的例項進行介紹,然後把例項以 makefile 檔案實現,並對 makefile 檔案進行簡單介紹。準備工作,下面是需要的簡單例項檔案及 main.cxx...
(c c )如何編譯簡單編譯多檔案
編譯程式編譯到一定 量時,就會需要將乙個檔案分為多個檔案進行編譯,每個檔案還會對應不同的標頭檔案,這時如果使用多檔案編譯很可能會出現重複定義的問題。問題主要 於兩個方面,一方面是引用標頭檔案時,因為引用的標頭檔案裡還引用其他檔案 另一方面是標頭檔案裡定義了變數,編譯多檔案時都引用了該檔案時就會出現重...
多檔案編譯
編譯多個檔案 編輯兩個檔案 cs 和 class.cs cs using system namespace test class.cs using system namespace test public void saysomething 執行的命令 引數的使用都和單個檔案的執行一樣 如果不指定生...