为什么Visual Studio在链接包含的文件时会出错

Why does Visual Studio error when linking having files included?

本文关键字:文件 出错 包含 Visual Studio 链接 为什么      更新时间:2023-10-16

我不太明白这背后的原因,但我想我已经找到了原因。

我哥哥正在做一个家庭作业项目,他们正在使用Visual Studio。他在编译他的项目时遇到了问题。所讨论的项目包括:

main.cpp
classes.h
class_functions.cpp
general_functions.cpp

它们有如下的导入结构:

main.cpp

#include "classes.h"
#include "class_functions.cpp"
#include "general_functions.cpp"

class_functions.cpp

#include "classes.h"

general_functions.cpp

#include "classes.h"

当他试图编译时,他总是得到链接错误,即使g++可以编译得很好。所以我尝试通过Visual Studio命令提示符和cl。这个编译得很好,所以我尝试了msbuild(显然?)失败了。我进入vxproj文件,因为,嘿,它告诉cl什么,我没有?

在项目文件中包括classes.hgeneral_functions.cppclass_functions.cpp以及main.cpp。当我删除一般和类函数时,msbuild运行得很好。把它们中的任何一个放回去,然后boomclasses.h包含

#ifndef myclasses
#define myclasses
/* Code here */
#endif

和其他.cpp文件包含类似的指令。

我终于想出了解决问题的办法-消除

#include "general_functions.cpp"
#include "class_functions.cpp"

,现在Visual Studio编译得很好。

问题是为什么要?这样做的理由或可能的好处是什么?

.cpp和.h文件的区别在于。h文件通常包含在#include指令中,而。cpp文件则包含在链接过程中。

#include指令将在编译的代码中插入包含文件的副本,因此通过包含.cpp文件,您将编译包含所有.cpp文件的单个源文件。这是一个非常糟糕的做法,但仍然可以工作。

但是如果你在链接步骤中添加。cpp文件,那么你将第二次添加这些文件,创建可能重复的函数定义,例如链接器错误。我认为这可能是主要的错误(没有链接器错误代码我只是猜测)。