2016-10-31 35 views
0

這是在我的系統目錄中的內容:如何在子目錄中使用.cpp和.h文件?

/directory/ 
    classes/ 
     class1.cpp 
     class1.h 
    main.cpp 

這裏是上述文件的內容:

的main.cpp

#include "classes/class1.h" 

    int main(){ 
     class1 test; 
     return 0; 
    } 

class1.h

class class1 { 
     public: 
      class1(); 
      void test(); 
    }; 

class1.cpp

#include "class1.h" 

    class1::class1(){ 
    } 
    class1::test(){ 
    } 

問題是爲什麼我無法編譯main.cpp

[email protected]:~/Desktop/directory$ g++ *.cpp 
/tmp/ccEvIogL.o: In function `main': 
main.cpp:(.text+0x1f): undefined reference to `class1::class1()' 
collect2: error: ld returned 1 exit status 

回答

4

在你的主directory只有一個.cpp文件和*通配符不子目錄看看。你需要明確地命名所有的源文件,或使用多個通配符(不是我推薦的)。

因此,像

g++ main.cpp classes/class1.cpp 
+0

是不是反正有動力G ++搜索所有的'cpp'文件的子目錄? – Abraham

+0

@Abraham不是GCC編號。如果你使用Makefile,那麼它是可能的,但我仍然建議你明確列出源文件。想想未來,你可能在根目錄中有多個項目,每個項目都是一個單獨的程序。只是盲目地獲取所有子目錄中的所有源文件將導致問題。 –

+0

@Abraham使用SCons或CMake等構建系統。 –

1

什麼您正在尋找是不相關的編譯器(GCC)本身,而是爲構建環境。有幾種工具可以完成這項工作。

如果您只從一堆文件開始,您可以每次編譯每個文件。但是如果你的項目變得更大,那麼一次又一次編譯所有文件是非常耗時的,如果其中一些文件沒有任何改變的話。

這個工作最常見的是gnu make。

你必須編寫一個描述你的項目的配置。這個文件通常被稱爲「Makefile」。

在此定義: 如果文件發生更改,則必須編譯哪些文件。 哪些文件必須鏈接在一起。 用於所有或單個文件的鏈接和編譯的所有參數。 ...很多更

所以,請大家看看對https://www.gnu.org/software/make/manual/

爲您的項目,也可以是這樣的:

all: myprog 

main.o: main.cpp classes/class1.h 

classes/class1.o: classes/class1.cpp classes/class1.h 

myprog: main.o classes/class1.o 
    g++ main.o classes/class1.o -o myprog 
相關問題