在 Visual Studio 中分离项目时遇到问题

Posted

技术标签:

【中文标题】在 Visual Studio 中分离项目时遇到问题【英文标题】:Trouble separating projects in visual studio 【发布时间】:2016-01-10 22:21:36 【问题描述】:

我正在使用 Visual Studio (Community 2013) 中的 SDL 在 C++ 中创建游戏框架。我从一个项目开始,其中包含我的游戏框架和一些简单的应用程序代码来测试它。现在,我想将游戏代码与其使用的框架分开。我想要两个独立的 Visual Studio 项目,一个用于框架,一个用于游戏。

但是,当我尝试此操作时,我无法正确链接以前工作的代码。我决定将原始项目保留为框架,并将应用程序代码移动到新创建的项目中。据我所知,我已经设置了所有包含目录、库目录和其他依赖项以匹配现有项目的内容。我还将必要的 dll 复制到新项目中,因为它将是起始项目(我已设置为这样)。

链接器似乎在处理采用 SDL 定义的数据类型的函数时遇到问题 - 例如,我有一个 Input 类来处理框架中的游戏输入。虽然我有一个功能(在项目拆分前工作):

bool isKeyDown(const SDL_Keycode& keycode);

它在链接器错误中显示为

error LNK2019: unresolved external symbol "public: bool __thiscall fj::Input::isKeyDown(int const &)" (?isKeyDown@Input@fj@@QAE_NABH@Z) referenced in function...

请注意SDL_Keycode 是如何因某种原因变成int 的,尽管#include <SDL.h> 存在于具有此功能的文件中!此外,这个函数在项目拆分中没有被移动,只是从新项目中调用。考虑到此错误消息数据类型更改,谁能诊断出我在这里做错了什么?

【问题讨论】:

【参考方案1】:

确保您链接到完全相同的库(注意不要将 Debug 与 Release 混为一谈)。

Linker -> Input -> Additional Dependencies 中确保包含正确的 .lib 文件

确保您传递相同的预处理器指令并且您的库路径设置正确。

澄清一下,如果你运行这个

typedef int OtherInt;
void f(OtherInt m);

int main() 
     f(0);

链接器也会抱怨int。错误 LNK2019:函数 _main 中引用的未解析的外部符号“void __cdecl f(int)”(?f@@YAXH@Z)

【讨论】:

啊,所以我的链接器错误中的int 并不表示我有任何不当行为?至于额外的依赖和库目录,两个项目的字符串完全相同,两个项目的预处理器指令都没有改变。 似乎isKeyDown 之类的函数是您的回调函数,而链接器找不到这些函数。确保在当前项目中提供了它们的定义,或者如果它们在另一个项目中,它们被正确导出并且链接器可以找到它们。检查这个link

以上是关于在 Visual Studio 中分离项目时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2008 中分析 MsTest 的单元测试?

在 Visual Studio 中添加 VB6 引用会给出“类型库导入器在类型验证期间遇到错误”

如何在 Windows 7 中使用 OpenGL、Glut 和 Visual Studio 2008 准备 C++ 项目

分析报告后,Visual Studio 2010 在分析时崩溃

在 Visual Studio 中分析故障转储

如何在 Visual Studio 2013 Express 中打开 C++ 项目?遇到很多错误