应用程序在vs2013中工作,但在用作独立exe时显示工件

时间:2014-05-10 07:35:22

标签: c++ visual-studio deployment directx

我有一个用C ++ / DirectX11编写的地形生成引擎,我认为同样的问题虽然没有解决,但是像这一个:

DirectX Release build works through VS2010, but not exe

简要说一下:VS中的配置设置为默认发布模式(平台x86)。但是,当我通过VS运行它时它可以正常工作,但是当作为独立的exe运行时显示奇怪的工件。但是,当我将运行时库配置为多线程调试DLL(在发布模式下)时,它甚至可以作为独立工作,但是我不应该将调试dll放入发布...这也会在使用静态时发生链接(多线程/ MT)。因此,应用程序可以在调试链接之外使用,但不能在发布时使用。

来自VS2013(ok):http://i838.photobucket.com/albums/zz306/jajcek/artifacts_isok_zps69abbb9f.png

作为独立的exe(不好):http://i838.photobucket.com/albums/zz306/jajcek/artifacts_zpsfd28d68b.png

我在想它可能是依赖关系,所以我从Dependency Walker看了它,但它显示了我的错误("找不到文件"):

API-MS-WIN-APPMODEL-RUNTIME-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ERROR-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-ROBUFFER-L1-1-0.DLL
API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL
API-MS-WIN-SHCORE-SCALING-L1-1-1.DLL
DCOMP.DLL
IESHIMS.DLL

这引出了我的主题,这个主题解释了它们只是误导:Win 7, 64 bit, dll problems

也许作为独立的应用程序,exe采用了错误的dll(较旧的?),我实际上已经安装了Redistributable软件包2005,2008,2010,2012(一次性),甚至尝试安装2013年没有帮助我。我还从控制面板中删除了所有这些(从最旧的开始逐个),应用程序仍然运行,但是再次使用工件。

我甚至试图将DLL复制到我运行exe的目录中。 DLL列表取自VS调试窗口:

'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\d3d11.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dxgi.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Cannot find or open the PDB file.
'3d_engine.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dxgidebug.dll'. Cannot find or open the PDB file.
// omitted

但正如你认为它没有工作......

VS2013运行时对应用程序做了什么?它不只是从Release目录运行exe吗?

我完全糊涂了,不知道应该多检查一下。你能给我任何一件好事吗?

1 个答案:

答案 0 :(得分:1)

我想到了两个不同之处:

  1. 从VS运行时,您可能仍在调试器内运行,可由进程检测到。这对于诊断来说很棘手,而且不太可能。
  2. 从VS运行时,它可能具有与您期望的不同的环境和工作目录,这可能会使路径无效并更改已加载的DLL集。在启动时,VS在调试输出中显示已加载的库及其路径。使用" depends.exe"。
  3. 运行可执行文件时,将这些与库进行比较

    请注意,使用调试DLL似乎可以解决问题,这表明您正在做错事,例如依赖未初始化变量的初始值。在编译期间检查所有警告,甚至可能提高警告级别。