VC++ 一个解决方案中的多个项目 - 链接器问题 (LNK2019)

Posted

技术标签:

【中文标题】VC++ 一个解决方案中的多个项目 - 链接器问题 (LNK2019)【英文标题】:VC++ Multiple projects in one solution - Linker issues (LNK2019) 【发布时间】:2021-02-20 10:44:37 【问题描述】:

为了获得易于维护的模块化代码,我将代码从以前的 VC++ 解决方案拆分到单独的其他项目中。那就是我可以维护单独的代码库,同时仍然能够将工作代码包含在解决方案中。我的解决方案资源管理器如下所示:

我已关注this(项目配置/VC++/额外包含路径)所以在这里回答,以允许fodHelperBypass.cpp 访问registry.cpp 中的方法。 VS 允许我然后导入 RegistryTools 项目的头文件:

事实上,如果我Ctrl + clickregistry.h 导入声明VS 将打开头文件,我可以确认它是从正确的位置加载的。 registry.cpp 文件位于同一目录中。

我还可以确认,在项目构建设置中,两个项目都设置为 x64 构建配置(在早期情况并非如此,并且 VS 无法找到 registry.h,因为 RegistryTools 构建配置设置为 x86 )。 VS 也能识别fodHelper.cpp 文件中的外部函数,并且不会给出任何未定义的错误。

然而,在尝试构建项目时,我收到LNK2019 中声明的每个方法的错误registry.h 和随后的registry.cpp

我已阅读this SO 帖子,但我不认为这适用,因为我没有声明任何课程。此外,当我简单地将registry.hregistry.cpp 复制并粘贴到解决方案目录中,并将它们添加到解决方案时,代码构建没有错误。

谁能解释一下我做错了什么导致链接器出现这个错误?

编辑

我已将本解决方案中涉及的两个子项目编译为.lib 文件,并且达到了预期的效果。虽然我仍然很困惑,但我必须这样做才能使用另一个 C++ 项目中的方法吗?引用的函数必须是静态库的一部分吗?

通过阅读第一个链接,我的印象是我所要做的就是在项目配置中添加包含目录,然后我就可以使用 RegistryTools 中的方法了。

RegistryTools 是一个项目,它包含一个包含四个函数的 cpp 文件,以及一个声明它们的头文件。

【问题讨论】:

SO 帖子是正确的。您使用在另一个项目中构建的方法。您需要链接到该项目。在 VS 中,通常通过 References 部分添加它。 我也试过了,但这给了我更多的链接器错误。将 RegistryTools 添加到引用部分会导致 46 个链接器错误MSVCRTD.lib,我的理解是,如果我使用 .lib 文件./static 库,我只需要以这种方式添加引用。尝试在一个解决方案中使用来自多个项目的代码时,我不知道自己正在这样做 RegistryTools 项目结构中也没有 .lib 文件,即使我已经构建了它。我需要做些什么来生成这些吗? @RandomHash 您的目的是将两个项目链接在一起。因此,即使这给您带来了更多错误,我也会专注于解决这些错误,而不是这个错误(这是因为您没有链接两个项目而发生的)。你也可以澄清一下你有什么样的项目。您暗示您没有使用静态库。 @john 我试图进一步解释情况,并提供了有关项目的更多信息 【参考方案1】:

适用于从 Python、Java 或任何其他解释性语言等语言转向 C++ 的任何程序员。这篇文章可能会帮助您解决您可能存在的一些误解。尝试从其他托管项目导入代码时,仅将辅助项目添加到解决方案的包含目录是不够的。

正如@john 所指出的,当尝试在 VC++ 解决方案中使用来自另一个项目的代码时,有两种选择。编译代码以导入为.lib(静态库)文件,该文件将包含在编译后的可执行文件中。该过程描述为here。

另一种选择是将要导入的项目代码编译为.dll(动态库)文件,该文件未如here 所述编译为最终可执行文件。

这两种方法各有优劣,由程序员根据自己的需要来决定。

【讨论】:

很高兴您得到了解决方案,感谢您的分享,如果您将它们标记为答案,我将不胜感激,这将对其他社区有益。

以上是关于VC++ 一个解决方案中的多个项目 - 链接器问题 (LNK2019)的主要内容,如果未能解决你的问题,请参考以下文章

我收到一个链接器错误,我不理解 VC++ 和 FLTK [关闭]

静态库中的 VC++ 资源

VC++2008 项目总是“过时”

VC++ 6 链接器错误

了解 VC++ 项目/解决方案资源管理器文件层次结构

Qt 开发 MS VC 控件终极篇