2016-03-07 88 views
0

我有我想要調試的代碼。我看起來沒問題。但是,我得到一個錯誤,我不understand.Here的我的代碼C++ - 這個單獨的編譯代碼有什麼問題?

//struct.h 
    #ifndef STRUCT_H 
    #define STRUCT_H 
    #include <iostream> 
    using namespace std; 

    struct Person { 
    Person(); 
    Person(int a, string n); 
    Person(const Person &p); 
    Person &operator=(const Person &p); 
    ~Person(); 
    int age; 
    string name; 
    }; 

    #endif 

//struct.cc 
    #include "struct.h" 

    Person::Person(): age(0), name("noname") { 
    cout << "Creating default Person" << endl; 
    } 

    Person::Person(int a, string n): age(a), name(n) { 
    cout << "Creating: " << name << "," << age << endl; 
    } 

    Person::Person(const Person &p) { 
    name = p.name; 
    age = p.age; 
    } 

    Person& Person::operator=(const Person &p) { 
    Person person; 
    person.name = p.name; 
    return person; 
    } 

    Person::~Person() { 
    cout << "Destroying: " << name << "," << age << endl; 
    } 

//structMain.cc 
    #include "struct.h" 
    #include <iostream> 
    using namespace std; 

    int main() { 
    Person one(21, "Zuhaib"); 
    cout << "I am " << one.name << ". I am " << one.age << " years old" << endl; 

    Person two; 
    cout << "I am " << two.name << ". I am " << two.age << " years old" << endl; 

    two = one; 
    cout << "I am " << two.name << ". I am " << two.age << " years old" << endl; 
    } 

g++ -c struct.cc 
g++ -c structMain.cc 

g++ -o struct.o structMain.o 

編譯然後我收到以下錯誤

structMain.o: In function `main': 
structMain.cc:(.text+0x3b): undefined reference to `Person::Person(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
structMain.cc:(.text+0xb5): undefined reference to `Person::Person()' 
structMain.cc:(.text+0x11e): undefined reference to `Person::operator=(Person const&)' 
structMain.cc:(.text+0x180): undefined reference to `Person::~Person()' 
structMain.cc:(.text+0x18c): undefined reference to `Person::~Person()' 
structMain.cc:(.text+0x1b8): undefined reference to `Person::~Person()' 
structMain.cc:(.text+0x1e3): undefined reference to `Person::~Person()' 
structMain.cc:(.text+0x1f4): undefined reference to `Person::~Person()' 
collect2: ld returned 1 exit status 

我想我包括所有的正確的文件。我仔細檢查了聲明和定義。我只是不確定爲什麼這些錯誤即將到來。我看起來很好。

此外,在主函數中,什麼在該行

two = one; 

我不知道這一點,因爲,我已經超負荷運營情況=,但我也定義拷貝構造函數也執行時「 =「。所以在上面的例子中,operator = execute或copy構造函數。 任何幫助,將不勝感激。 感謝

+2

請重新考慮您對不良做法['using namespace std;'](http://stackoverflow.com/q/1452721/1171191)和['endl'](http://chris-sharpe.blogspot。 co.uk/2016/02/why-you-shouldnt-use-stdendl.html)。 – BoBTFish

+2

最後一行分隔編輯接縫奇怪。嘗試不用'-c'選項 – Garf365

+0

@ Garf365。我很抱歉,那應該是一個-o。我已經改變了它 –

回答

4

當你使用:

g++ -o struct.o structMain.o 

g++試圖通過使用代碼structMain.o產生一個可執行文件,並把生成的可執行文件中struct.o。由於structMain.o沒有用於創建可執行文件的所有對象代碼,因此會出現鏈接器錯誤。

您需要使用:

g++ -o MyProgram struct.o structMain.o 

這裏,g++試圖生成可執行通過使用代碼struct.ostructMain.o並把產生的可執行文件中MyProgram。假設你在這兩個文件中具有所有必需的目標代碼,那應該可行。

+1

正確的答案解釋了爲什麼,而不是僅僅傾銷一行「代碼」。 –

+0

@BarryTheHatchet,感謝prod。 –

+0

np現在好多了 –

2
g++ -o struct.o structMain.o 

這告訴g++採取目標代碼在structMain.o,把它變成一個可執行文件,該可執行文件struct.o名。

當你的編譯器不正是你告訴它,你剛纔覆蓋在struct.o目標代碼,剛巧握住你的Person類的定義,所以是的,通過structMain.o的那類引用仍然沒有得到解決。

什麼你是:

g++ struct.o structMain.o 

...或者給出一個明確的輸出名稱,是不是也是你的輸入文件之一的名稱...

g++ -o someGuessedExecutableName struct.o structMain.o 

一個常見的約定是在它定義的類之後命名源文件,即將其命名爲Person.ccPerson.o而不是struct.cc/struct.o ......這會使該錯誤更明顯。

+0

可以很好地展示完整的解決方案(根據RSahu的答案),包括使用'-o'開關。 –

+0

@BarryTheHatchet:我只能猜測OP爲可執行文件指定了什麼名字...... ;-) – DevSolar

+0

確實,但是'myExecutableNameHere'會做:P –