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 + click
registry.h
导入声明VS 将打开头文件,我可以确认它是从正确的位置加载的。 registry.cpp
文件位于同一目录中。
我还可以确认,在项目构建设置中,两个项目都设置为 x64 构建配置(在早期情况并非如此,并且 VS 无法找到 registry.h
,因为 RegistryTools 构建配置设置为 x86 )。 VS 也能识别fodHelper.cpp
文件中的外部函数,并且不会给出任何未定义的错误。
然而,在尝试构建项目时,我收到LNK2019
中声明的每个方法的错误registry.h
和随后的registry.cpp
。
我已阅读this SO 帖子,但我不认为这适用,因为我没有声明任何课程。此外,当我简单地将registry.h
和registry.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)的主要内容,如果未能解决你的问题,请参考以下文章