将 hpp 和 cpp 问题与 g++ 编译器联系起来
linking hpp and cpp issues with g++ compiler
我是 c++ 的新手,具有扎实的 C 和面向对象背景。所以我写了下面的代码。
我有 Person.hpp
如下:
class Person
{
private:
struct h
{
char *name;
unsigned char age;
};
struct h entities;
public:
unsigned char age();
char *name();
Person(char *name, unsigned char a);
~Person();
};
Person.cpp
看起来如下:
#include "Person.hpp"
char *Person::name()
{
return entities.name;
}
unsigned char Person::age()
{
return entities.age;
}
Person::Person(char *name, unsigned char a)
{
entities.name = name;
entities.age = a;
}
最后 main.cpp
如下所示:
#include <iostream>
#include "Person.hpp"
int main()
{
Person someone("something", 100);
printf("%s is %d old\n", someone.name(), someone.age());
return 0;
}
我已经知道由于字符串不是常量而导致的警告。这不会在尝试编译时导致错误。我尝试用两种不同的方法编译代码。一种是将所有内容编译在一起,如下所示:
g++ -o main main.cpp Person.cpp
我尝试的第二种方法是将它们编译成目标文件,然后 link 将它们放在一起:
g++ -c main.cpp
g++ -c Person.cpp
g++ -o main main.o Person.o
他们都给出了以下错误:
/usr/bin/ld: main.o: in function `main':
main.cpp:(.text+0x5b): undefined reference to `Person::~Person()'
/usr/bin/ld: main.cpp:(.text+0x6e): undefined reference to `Person::~Person()'
collect2: error: ld returned 1 exit status
如有任何帮助,我们将不胜感激。
您在头文件中声明了一个析构函数:
public:
unsigned char age();
char *name();
Person(char *name, unsigned char a);
~Person(); // <===== Declared here
但是您还没有为它提供任何定义。
但是,析构函数是在您的 main
函数 returns 之后调用的(您可以了解有关此行为的更多信息 here),因此它需要一个定义。
您可以通过省略析构函数声明或使用 ~Person() = default
.
让编译器为您生成定义
问题是您在 Person.hpp
中同时声明了构造函数和 destructor
,但只在 Person.cpp
文件中定义了构造函数。
尝试将以下代码添加到 Person.cpp
:
Person::~Person()
{
}
我是 c++ 的新手,具有扎实的 C 和面向对象背景。所以我写了下面的代码。
我有 Person.hpp
如下:
class Person
{
private:
struct h
{
char *name;
unsigned char age;
};
struct h entities;
public:
unsigned char age();
char *name();
Person(char *name, unsigned char a);
~Person();
};
Person.cpp
看起来如下:
#include "Person.hpp"
char *Person::name()
{
return entities.name;
}
unsigned char Person::age()
{
return entities.age;
}
Person::Person(char *name, unsigned char a)
{
entities.name = name;
entities.age = a;
}
最后 main.cpp
如下所示:
#include <iostream>
#include "Person.hpp"
int main()
{
Person someone("something", 100);
printf("%s is %d old\n", someone.name(), someone.age());
return 0;
}
我已经知道由于字符串不是常量而导致的警告。这不会在尝试编译时导致错误。我尝试用两种不同的方法编译代码。一种是将所有内容编译在一起,如下所示:
g++ -o main main.cpp Person.cpp
我尝试的第二种方法是将它们编译成目标文件,然后 link 将它们放在一起:
g++ -c main.cpp
g++ -c Person.cpp
g++ -o main main.o Person.o
他们都给出了以下错误:
/usr/bin/ld: main.o: in function `main':
main.cpp:(.text+0x5b): undefined reference to `Person::~Person()'
/usr/bin/ld: main.cpp:(.text+0x6e): undefined reference to `Person::~Person()'
collect2: error: ld returned 1 exit status
如有任何帮助,我们将不胜感激。
您在头文件中声明了一个析构函数:
public:
unsigned char age();
char *name();
Person(char *name, unsigned char a);
~Person(); // <===== Declared here
但是您还没有为它提供任何定义。
但是,析构函数是在您的 main
函数 returns 之后调用的(您可以了解有关此行为的更多信息 here),因此它需要一个定义。
您可以通过省略析构函数声明或使用 ~Person() = default
.
问题是您在 Person.hpp
中同时声明了构造函数和 destructor
,但只在 Person.cpp
文件中定义了构造函数。
尝试将以下代码添加到 Person.cpp
:
Person::~Person()
{
}