正在创建另一个项目中定义的 class 个对象
Creating class object defined in another project
我有一个包含 2 个项目的 Visual C++ 解决方案:rectangle 和 project3.
在矩形项目中我有 rect.cpp 和 rect.h.
rect.h
#ifndef rect_h
#define rect_h
class Rect
{
public:
Rect();
int m_h;
int m_w;
};
#endif //rect_h
rect.cpp
#include "rect.h"
Rect::Rect()
{
m_h = 1;
m_w = 5;
}
每当我尝试从矩形项目创建矩形对象时,它都会成功。
但是当我尝试从 project3 执行相同操作时,它会产生 linker 错误。
LNK2019: unresolved external symbol "public: __thiscall
Rect::Rect(void)" (??0Rect@@QAE@XZ) referenced in function _main
1>C:\Users\mbaro\documents\visual studio
2017\Projects\Project2\Debug\Project3.exe : fatal error LNK1120: 1
unresolved externals
main.cpp(在项目 3 中)
#include "rect.h"
using namespace std;
int main()
{
Rect* a = new Rect();
return 0;
}
我觉得 class 定义被成功获取,但是 linker 不能 link 来自 rect.cpp.[=15= 的构造函数代码]
问题是什么以及如何解决?
谢谢。
我已经开始写很长很长的答案了。然后我意识到,你可能遗漏的是,尽管你的 class 被命名为 "Person",但你应该添加的头文件被命名为 "rect.h".
此外,您的构造函数不能在头文件中声明值(编辑:不正确,我弄错了)。在头文件中,尝试使用:
Person(int h, int w);
您声明需要什么,而不是您已经拥有的。如果您希望这些具体是您编写的构造函数应该是:
Person();
在.h
和
Person::Person()
{
m_h = 1;
m_w = 5;
}
.cpp.
如果您需要更详细的使用 include 的说明,我已经写了大部分内容,请不要犹豫。
错误是正常的:您告诉编译器在哪里可以找到 .h 文件,但是您没有告诉 linker 它可以在哪里找到 .obj 文件。
它可能取决于确切的 VS 版本,但在 Project/Properties 中,您应该找到 Linker/Input 并且有其他依赖项。如果您只需要来自其他项目的一个或两个目标文件 (xxx.obj
),请在此处添加它们。这样,您就可以避免代码重复,这将是未来维护的噩梦...
如果您有许多公用文件,您应该考虑将它们放在一个辅助项目中,该项目将在同一解决方案中构建一个(静态)库,然后 link 两个项目(和当然可以为使用该库的其他项目访问该库项目的头文件。
我有一个包含 2 个项目的 Visual C++ 解决方案:rectangle 和 project3.
在矩形项目中我有 rect.cpp 和 rect.h.
rect.h
#ifndef rect_h
#define rect_h
class Rect
{
public:
Rect();
int m_h;
int m_w;
};
#endif //rect_h
rect.cpp
#include "rect.h"
Rect::Rect()
{
m_h = 1;
m_w = 5;
}
每当我尝试从矩形项目创建矩形对象时,它都会成功。
但是当我尝试从 project3 执行相同操作时,它会产生 linker 错误。
LNK2019: unresolved external symbol "public: __thiscall Rect::Rect(void)" (??0Rect@@QAE@XZ) referenced in function _main 1>C:\Users\mbaro\documents\visual studio 2017\Projects\Project2\Debug\Project3.exe : fatal error LNK1120: 1 unresolved externals
main.cpp(在项目 3 中)
#include "rect.h"
using namespace std;
int main()
{
Rect* a = new Rect();
return 0;
}
我觉得 class 定义被成功获取,但是 linker 不能 link 来自 rect.cpp.[=15= 的构造函数代码]
问题是什么以及如何解决?
谢谢。
我已经开始写很长很长的答案了。然后我意识到,你可能遗漏的是,尽管你的 class 被命名为 "Person",但你应该添加的头文件被命名为 "rect.h".
此外,您的构造函数不能在头文件中声明值(编辑:不正确,我弄错了)。在头文件中,尝试使用:
Person(int h, int w);
您声明需要什么,而不是您已经拥有的。如果您希望这些具体是您编写的构造函数应该是:
Person();
在.h
和
Person::Person()
{
m_h = 1;
m_w = 5;
}
.cpp.
如果您需要更详细的使用 include 的说明,我已经写了大部分内容,请不要犹豫。
错误是正常的:您告诉编译器在哪里可以找到 .h 文件,但是您没有告诉 linker 它可以在哪里找到 .obj 文件。
它可能取决于确切的 VS 版本,但在 Project/Properties 中,您应该找到 Linker/Input 并且有其他依赖项。如果您只需要来自其他项目的一个或两个目标文件 (xxx.obj
),请在此处添加它们。这样,您就可以避免代码重复,这将是未来维护的噩梦...
如果您有许多公用文件,您应该考虑将它们放在一个辅助项目中,该项目将在同一解决方案中构建一个(静态)库,然后 link 两个项目(和当然可以为使用该库的其他项目访问该库项目的头文件。