2016-03-07 55 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 –