【发布时间】: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.h 和registry.cpp 复制并粘贴到解决方案目录中,并将它们添加到解决方案时,代码构建没有错误。
谁能解释一下我做错了什么导致链接器出现这个错误?
编辑
我已将本解决方案中涉及的两个子项目编译为.lib 文件,并且达到了预期的效果。虽然我仍然很困惑,但我必须这样做才能使用另一个 C++ 项目中的方法吗?引用的函数必须是静态库的一部分吗?
通过阅读第一个链接,我的印象是我所要做的就是在项目配置中添加包含目录,然后我就可以使用 RegistryTools 中的方法了。
RegistryTools 是一个项目,它包含一个包含四个函数的 cpp 文件,以及一个声明它们的头文件。
【问题讨论】:
-
SO 帖子是正确的。您使用在另一个项目中构建的方法。您需要链接到该项目。在 VS 中,通常通过 References 部分添加它。
-
我也试过了,但这给了我更多的链接器错误。将 RegistryTools 添加到引用部分会导致 46 个链接器错误
MSVCRTD.lib,我的理解是,如果我使用 .lib 文件./static 库,我只需要以这种方式添加引用。尝试在一个解决方案中使用来自多个项目的代码时,我不知道自己正在这样做 -
RegistryTools 项目结构中也没有 .lib 文件,即使我已经构建了它。我需要做些什么来生成这些吗?
-
@RandomHash 您的目的是将两个项目链接在一起。因此,即使这给您带来了更多错误,我也会专注于解决这些错误,而不是这个错误(这是因为您没有链接两个项目而发生的)。你也可以澄清一下你有什么样的项目。您暗示您没有使用静态库。
-
@john 我试图进一步解释情况,并提供了有关项目的更多信息
标签: c++ visual-studio linker-errors