程序在VS 2013中能运行,但无法在.exe文件中运行

5

我在Visual Studio 2013中使用Direct X 11制作了一个测试程序。它包含一个简单的精灵,根据计时器实现缓慢旋转。该程序使用F5或Ctrl-F5加载和运行良好,但是当我尝试打开实际创建的.exe文件(在我的\ Debug文件夹中)时,它只显示窗口然后立即关闭。

我读到的大多数答案都涉及从Visual Studio内部加载.exe。我也尝试了Release模式,但情况仍然相同。


3
难道不可能是exe文件无法在相同目录中找到精灵或类似的东西吗? - Cyclonecode
是的,几乎可以肯定这是由于以两种不同的方式启动程序时“当前工作目录”不同所致。 - john
根据我的经验,此类问题通常是由于路径相对于项目而不是应用程序而来。 - Aluan Haddad
非常准确,Krister!谢谢。这是我第一次做除了控制台应用程序之外的任何事情,在那里一切都被整齐地包装在.exe文件中。不确定如何接受评论答案... - Steve Hatcher
2
您可以通过设置项目属性/配置属性/调试/工作目录为$(OutDir)(或显式路径),将调试目录(从F5运行)设置为与.exe文件所在位置相同,以查找/避免这些问题。 - parrowdice
显示剩余2条评论
1个回答

7

Sprite文件存储在您的项目文件夹中。默认情况下,从Visual Studio IDE运行时会在执行的项目文件夹中运行。也就是说,通常它会在保存.vcproj或.vcprojx文件的目录中执行(这通常是您的解决方案目录文件夹的下一级文件夹)。

如果您的项目在IDE中正确运行,但直接从调试文件夹运行失败,那么很可能您依赖于与源文件一起存储在项目文件夹中的项目数据文件。当从Debug文件夹运行时,这些文件不再可见,因为Debug文件夹是您的工作目录,而不是项目文件夹。

有许多方法可以解决这个问题,每种方法都有其自身的优点。以下是几个选项:

后置生成步骤

为您的项目创建一个后置生成步骤,将您的数据文件复制到$(TargetDir)位置与您的项目一起。这些文件将出现在与可执行文件相同的目录中。

Benefit: Its easy.
Drawback: It will always run if you click "build solution" even if the data files are "up-to-date."

自定义构建目标

将您的数据文件添加到项目中,并编写一个自定义构建脚本,执行相同的复制操作,还要建立一个输出依赖文件。

Benefit: Almost as easy as #1, but a little more tedious.
Drawback: You may have a lot of data files and each will require its own custom build step. (Note: you can multi-select all the data files in your project, and if you're creative with the built-in macros you can have them all use the "same" build rules and commands).

嵌入式资源

将数据文件作为自定义资源添加到可执行文件中。

Benefit: Your project no longer requires data files side-by-side with the executable since they are embedded in the resource table of your EXE module.
Drawback: Custom code is required to dynamically load the custom resources from your executable's resource table rather than off-disk. It isn't difficult at all to do, but is additional work.

还有其他选项,但我希望这些能给你一些开始的思路。


非常好,嵌入式资源听起来很不错,我会试一下。 - Steve Hatcher
2
@Steve Hatcher 你可以在项目设置的“调试”下更改工作文件夹。通常情况下,您希望将其更改为 $(TargetDir)(例如目标二进制文件夹)。然后,在代码中,使用相对于您的二进制文件夹(\Debug 在您的情况下)的文件路径。例如:../resources/sprite.jpg 而不是 sprite.jpg。(.. 将目录树向上移动一级,因此 sprite.jpg 将始终在二进制文件夹上一级的 resources 文件夹中搜索)。这难道不是最简单和“正确”的做法吗?=)@Imran Rizvi 您能否将此选项添加到您的答案中? - Ivan Aksamentov - Drop
1
太好了,希望这能避免其他人遭受这样的痛苦。谢谢。 - Steve Hatcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接