【发布时间】:2021-03-15 10:52:36
【问题描述】:
我有一个名为 IncludeFileHelp 的解决方案,它使用 SampleClass.h 和 SampleClass2.cpp。
#include <SampleClass2.h>
void main() {
SampleClass2 sampleClass2Obj;
sampleClass2Obj.printHello();
}
SampleClass.h
#pragma
#include <iostream>
class SampleClass2 {
public:
SampleClass2() {}
void printHello();
};
SampleClass2.cpp
#include <SampleClass2.h>
void SampleClass2::printHello() {
std::cout << "Hello from SampleClass2!" << std::endl;
}
我将 SampleClass2.h 和 SampleClass.cpp 的正确目录路径添加到 Additional Include Directories。
当我将 SampleClass2.h 添加到解决方案资源管理器中的头文件并将 SampleClass2.cpp 添加到解决方案资源管理器中的源文件时,程序运行没有任何问题。
但是,如果我从解决方案资源管理器中删除 SampleClass2.h 和 SampleClass2.cpp,我会收到以下错误:
unresolved external symbol "public: void __thiscall SampleClass2::printHello(void)" (?printHello@SampleClass2@@QAEXXZ) referenced in function _main
我知道如何解决此错误的唯一方法是将 SampleClass2.h 和 SampleClass2.cpp 文件拖放回解决方案资源管理器。这在复制或克隆解决方案时会成为一个繁琐的问题,因为即使 Visual Studio 识别该类及其功能,我也必须手动添加所有包含的文件。
我可以做些什么来让我的程序可以在 Visual Studio 2019 中运行,而不必在解决方案资源管理器中包含包含的类头文件和 .cpp 文件?
我唯一能想到的就是将#pragma 更改为:
#ifndef SAMPLECLASS2
#define SAMPLECLASS2
...
#endif /*SAMPLECLASS2*/
但这不起作用。
【问题讨论】:
-
标题不是问题;编译工作。您的错误是未定义的引用,因为
SampleClass2.cpp未包含在您的项目中。它需要。时期。在您尝试通过#include-ing 将 .cpp 文件放入另一个文件来规避这种情况之前......只是......不要。 -
好的,它可以在解决方案资源管理器中没有头文件的情况下运行。但是,我需要在解决方案资源管理器中有 SampleClass2.cpp 吗?我问是因为其他库(例如 OpenCV)不需要我在解决方案资源管理器中显示 .cpp 文件。我的 SampleClass2.cpp 与 SampleClass2.h 位于同一文件夹中。
-
“我问是因为其他图书馆” - 是的,这就是重点;它们是已构建并链接到您的程序的库。您的示例 cpp 没有此功能。当然,您可以制作一个,但这有点超出了本文的范围。
-
因此,如果我想在解决方案资源管理器中没有类 .cpp 文件的情况下运行我的代码,我需要学习如何为我的类制作 .dll 和 .lib 文件?
-
一个库,无论是静态的还是动态的,都会被提上日程,是的。它的分发将是一个公共头文件,一个 .lib,在动态库 (dll) 的情况下也是如此。该lib在附加链接依赖中链接到您的程序,如果是动态的,则dll必须在运行时可解析;通常与可执行文件放在同一文件夹中。正如我所说,设置所有这些都超出了这篇文章的范围,应该由你进行调查。可能有很多网络链接可以指导您如何使用 VS 构建您喜欢的任何类型的库。
标签: c++ visual-studio