为啥我们在 Visual Studio 2013 中引用 C++ 项目?

Posted

技术标签:

【中文标题】为啥我们在 Visual Studio 2013 中引用 C++ 项目?【英文标题】:Why do we reference C++ projects in Visual Studio 2013?为什么我们在 Visual Studio 2013 中引用 C++ 项目? 【发布时间】:2015-02-07 20:10:31 【问题描述】:

当我们打算使用引用项目中的方法时,为什么必须在 Visual Studio 2013 中引用项目(对于 C++)?我很困惑,因为我们使用了 #include 预处理器指令,该指令将我们打算使用的代码复制并粘贴到仍然在实际使用它的方法之上/之前的同一个头文件中。

基本上,即使我将所有 项目 放在同一个 solution 文件中,并且头文件可以正确找到彼此(intellisense 不会抱怨/正确 linting发生),我仍然得到链接器错误。但是,即使引用项目纯粹是为了解决链接器错误,如果智能感知可以peek/显示定义到我从单独的项目中导入的代码,这是否意味着 Visual Studio 也知道我链接的是哪个项目?

一定是有原因的,我们都 #include 并且即使现在在 VS 2013 中也引用了包含的项目。有人可以帮助解释原因吗?

【问题讨论】:

#include 只会让编译器满意。你也有代码的链接。 “添加引用”是一种告诉构建系统您想要链接其他项目的静态库或导入库的简单方法。偶然发现它很有用,太多习惯于 .NET 的程序员也想在 C++ 项目中使用“添加引用”。所以微软只是让它以这种方式工作。 【参考方案1】:

“一定是有原因的,我们#include 并在 VS 2013 中引用了包含的项目。有人可以帮忙解释一下原因吗?”

包含头文件允许从那里使用(函数、类或结构的)声明。但要获得一个完全可执行的程序,还有更多必要:

    编译器需要知道从哪里获取#include'd 头文件 来自不同项目的编译源代码需要链接到最终工件 链接器需要知道从何处获取链接库

如果您只有标头库,则至少 2 点将不相关,但 Visual Studio 仍需要项目参考来解析头文件路径。


特别是对于 Visual Studio,还有可用的 #import 指令,它可以更轻松地链接到共享库(并将这些作为独立项目,而不是来自同一解决方案的引用项目)。

【讨论】:

@deviantfan 是的!这就是 IDE 实际做的事情(不是编译器)。【参考方案2】:

不,链接器在任何给定时间神奇地猜测您想要链接到项目中的定义在计算上是不可行的。它没有尝试这样做是一件好事。

【讨论】:

我不知道哪个白痴对此投了反对票。对于初学者来说,这是一个有点神秘的答案,但绝不是错误的!【参考方案3】:

C/C++编译过程有两个步骤:

将 (.c/.cpp) 源代码编译成 lib(需要外部 .h 文件) 将所有必要的lib文件链接成可执行文件(需要自己编译的lib文件和外部lib文件。毕竟外部.h文件只包含定义)

【讨论】:

以上是关于为啥我们在 Visual Studio 2013 中引用 C++ 项目?的主要内容,如果未能解决你的问题,请参考以下文章

为啥最小 MFC 项目在 Visual Studio 2013 上存在链接错误?

为啥我的 Visual Studio 2013 项目需要 mfc100.dll?

Visual Studio 2013 Reference Hell - 它一直在寻找任何不存在的旧版本的 DLL - 为啥?

更短的循环,相同的覆盖率,为啥我会在 Visual Studio 2013 的 c++ 中获得更多的 Last Level Cache Misses?

为啥Visual Studio这么垃圾?

Visual Studio2013为啥调试的时候总显示缓冲区溢出,不能运行