【问题标题】:Why does Visual Studio error when linking having files included?为什么在链接包含文件时 Visual Studio 会出错?
【发布时间】:2014-03-11 01:27:10
【问题描述】:

我真的不明白这背后的原因,但我想我已经弄清楚了。

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

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

它们具有以下导入结构:

ma​​in.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 我不是什么?

在 proj 文件中,它包括 classes.h、general_functions.cpp 和 class_functions.cpp,以及 main.cpp。当我删除通用函数和类函数时,msbuild 运行得很好。将它们中的任何一个放回去并boom。 classes.h 包含

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

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

我终于想出了消除问题的方法——消除

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

来自代码库,现在 Visual Studio 可以很好地编译它。

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

【问题讨论】:

    标签: c++ visual-studio visual-studio-2012 msbuild


    【解决方案1】:

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

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

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

    【讨论】:

    • 它是在抱怨链接器的问题。为什么一个单一的源文件是不好的做法?反正不是都编译成一个可执行文件吗?显然,如果您要重复使用,我可以看到一个问题...
    • 对 .cpp 文件使用 #include 是一种不好的做法。不同的文件扩展名 .h/.cpp 是为了区分它的用法:#include 文件或链接文件。当您使用 #include 时,该文件将“复制”到当前编译的 .cpp 文件中。
    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2011-06-13
    • 2010-10-05
    相关资源
    最近更新 更多