【问题标题】:C++ - What's wrong with this separate compilation code? [closed]C++ - 这个单独的编译代码有什么问题? [关闭]
【发布时间】:2016-06-21 05:40:27
【问题描述】:

我有这段代码正在尝试调试。在我看来没问题。但我收到一个我不明白的错误。这是我的代码

//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=,但我还定义了在遇到“=”时也会执行的复制构造函数。因此,在上述情况下,是 operator= 执行还是复制构造函数。 任何帮助,将不胜感激。 谢谢

【问题讨论】:

  • 请重新考虑您使用的不良做法 using namespace std;endl
  • 最后一行分开的编译接缝奇怪。尝试不使用-c 选项
  • 试试g++ -o out struct.o structMain.o
  • @Q_A:尽快改掉这个习惯。
  • 我投票结束这个问题,因为这是一个简单的错字,以不太可能帮助其他人的方式解决。

标签: c++ struct g++ operator-overloading copy-constructor


【解决方案1】:

使用时:

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。假设您在这两个文件中拥有所有必需的目标代码,那应该可以工作。

【讨论】:

  • 一个正确的答案解释了原因,而不是仅仅转储一行“代码”。
  • @BarryTheHatchet,感谢您的鼓励。
  • np 现在好多了
【解决方案2】:
g++ -o struct.o structMain.o

这告诉g++ 获取structMain.o 中的目标代码,将其转换为可执行文件,并将该可执行文件命名为struct.o

当您的编译器完全按照您的指示进行操作时,您刚刚覆盖了 struct.o 中的目标代码,它恰好包含您的 Person 类的定义,所以是的,@987654327 对该类的引用@ 仍未解决。

想要的是:

g++ struct.o structMain.o

...或给出一个明确的输出名称​​这不是您的输入文件之一的名称...

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

一个常见的约定是在源文件定义的类之后命名一个源文件,即将它命名为Person.ccPerson.o 而不是struct.cc / struct.o...这会使该错误更加明显。

【讨论】:

  • 最好展示完整的解决方案(根据 RSahu 的回答),包括使用 -o 开关。
  • @BarryTheHatchet:我只能猜测 OP 为可执行文件准备的名称...... ;-)
  • 没错,但myExecutableNameHere 会这样做:P
  • @BarryTheHatchet:大声笑...我去了someGuessedExecutableName,我希望也可以。 ;-)
猜你喜欢
  • 2015-02-23
  • 1970-01-01
  • 2013-07-31
  • 2013-12-27
  • 2021-10-22
  • 1970-01-01
  • 2013-04-30
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多