2012-10-18 37 views
2

我有幾個.cpp和.hpp文件。我想編譯並使用make來使用它們。我怎樣才能做到這一點 ?如何編譯多個文件使得

sample.cpp sample.hpp 
    sample_2.cpp sample_2.hpp 
    sample_3.cpp sample_3.hpp 
    ... 
    and 
    main.cpp 

    I have done : 

    default: 

      g++ -c sample sample.cpp 
      g++ -c sample_2 sample_2.cpp 
      g++ -c sample_3 sample_3.cpp 

      g++ -o main main.cpp sample sample_2 sample_3 

當I型作出終端,它提供錯誤:

/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10 
+0

閱讀gcc手冊和make手冊。至少,學習如何在沒有make的情況下實現你想要的shell。 –

+0

如果您的'make'甚至不執行,請重新安裝它。 – EJP

回答

3
相反

具有單個default目標,做一切每個單獨的輸出應該是一個make目標的。這允許make正常工作,一次構建一件事,按照正確的順序(或者如果依賴關係圖允許的話,並行地)並且在每個步驟正確地報告錯誤。另外,非常重要的是,通過講述關於每個單獨目標以及它們依賴於的內容,確保當依賴性發生變化時,由於依賴性發生變化,make會準確知道需要重新構建哪些目標。這是Make的最佳功能。

在你的情況下,最終的目標是main所以你想要的default目標說main構建,你要做的就是main的先決條件:

default: main 

現在你需要說如何建立main ,這取決於不同的目標文件,所以我們告訴作出這樣的:

main: main.o sample.o sample_2.o sample_3.o 

這表示這取決於這些目標文件(它們是其prerequsites),所以他們會b首先建成。這些對象中的每一個都是另一個將單獨構建的製作目標。

當所有先決條件已建成配方將被用於將它們連接到main,所以我們需要一個配方添加到上述目標:

main: main.o sample.o sample_2.o sample_3.o 
     g++ main.o sample.o sample_2.o sample_3.o -o main 

製作有很多的縮寫來簡化事情,例如$(CXX)是C++編譯器,[email protected]意味着當前目標和$^意味着當前目標的先決條件,這樣你就可以簡化規則:

main: main.o sample.o sample_2.o sample_3.o 
     $(CXX) $^ -o [email protected] 

這實際上是你所需要的,讓已經知道如何使用來構建.o先決條件它的內置規則,所以它會看到一個名爲main.cpp的文件,並且知道它可以編譯創建main.o,並參見sample.cpp並將其編譯爲sample.o等。它將從makefile創建一個依賴關係圖來決定需要哪些目標以便建立default(這意味着它決定需要main,需要main.osample.o等,他們需要main.cppsample.cpp等,這些已經存在,所以它可以開始建設的先決條件,直到它必須然後鏈接main所需要的一切就可以做到這一點,光潔度。)

現在,如果你改變sample_2.cpp和再次運行make會看到sample_2.o已過期,需要重新編譯,但其他.o文件還行(它們是新的,然後它們所依賴的.cpp文件),因此它會重新編譯sample_2.o和重新鏈接main而不是重建一切

事實上,你甚至可以進一步簡化它,使用默認的配方鏈接對象成可執行:

LINK.o = $(CXX) 

default: main 

main: main.o sample.o sample_2.o sample_3.o 

這就是你所需要的!但是,對於初學者來說,通常會更清晰地使用更詳細的版本,因爲當您不熟悉Make的所有自動規則和變量時,定製更容易。

告訴make有關頭文件的依賴關係也很有幫助,這樣當頭文件發生變化時,事情就會重建。這可以使用編譯器自動完成,以生成先決條件,但對於簡單的情況,您可以直接將其添加到makefile中,例如,

sample.o: sample.hpp sample.cpp 
+0

主要的是,我使用了樣本A; sample.cpp中的類名是Sample-。然後,當我編譯時,在此範圍內未聲明錯誤Sample。我該怎麼辦?我用'LINK.o = ...'來編譯我的代碼。 – user1743323

+1

這聽起來像是一個完全不同的問題,你有#include定義'Sample'的頭文件嗎?也許你應該在C++和「獨立編譯」模型中找到一本很好的教程或書籍 –