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

时间:2021-02-20 10:44:37

标签: c++ visual-studio linker-errors

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

Solution explorer

我已经按照 this (Project config/VC++/Extra Include paths) SO 回答这里,以允许 fodHelperBypass.cpp 访问 registry.cpp 中的方法。 VS 允许我导入 RegistryTools 项目的头文件:

Import declarations

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

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

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

Linker error

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

有人可以解释一下我做错了什么导致链接器出现此错误吗?

编辑

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

两种方法各有利弊,由程序员根据自己的需要决定。

相关问题