Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用程序在vs2013中工作,但在用作独立exe时显示工件_C++_Visual Studio_Deployment_Directx - Fatal编程技术网

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

C++ 应用程序在vs2013中工作,但在用作独立exe时显示工件,c++,visual-studio,deployment,directx,C++,Visual Studio,Deployment,Directx,我有一个用C++/DirectX11编写的地形生成引擎,我认为同样的问题,尽管没有得到解决,比如: 简单地说:VS中的配置设置为默认发布模式(平台x86)。但是,当我通过VS运行它时,它可以正常工作,但当作为独立的exe运行时,它会显示奇怪的工件。但是,当我在配置中将运行库设置为多线程调试DLL(在发布模式下)时,它甚至可以作为单机运行,但我不应该将调试DLL设置为发布模式。。。使用静态链接(多线程/MT)时也会发生这种情况。因此,该应用程序在外部使用调试链接,但不使用发布 从VS2013(o

我有一个用C++/DirectX11编写的地形生成引擎,我认为同样的问题,尽管没有得到解决,比如:

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

从VS2013(ok)开始:

作为独立exe(不正常):

我认为这可能是有依赖关系的,所以我从Dependency Walker查看了它,但它显示了这个(“找不到文件”)上的错误:

这就引出了一个话题,解释了它们只是误导:

也许作为一个独立的应用程序,exe采用了错误的dll(旧的?),我实际上安装了可再发行的软件包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在运行时对应用程序做了什么?它不是从发布目录运行exe吗?


我完全糊涂了,不知道我应该多检查些什么。你能给我一些东西吗?

我想到了两个不同点:

  • 当从VS运行时,您可能仍在调试器中运行,该调试器可以被进程检测到。这很难诊断,而且不太可能
  • 从VS运行时,它的环境和工作目录可能与您预期的不同,这可能导致路径无效并更改加载的DLL集。启动时,VS在调试输出中显示加载的库及其路径。使用“depends.exe”独立运行可执行文件时,将这些库与库进行比较

  • 请注意,使用调试DLL似乎可以解决问题,这表明您做了一些错误的事情,例如依赖未初始化变量的初始值。在编译过程中检查所有警告,甚至可能增加警告级别。

    如果在发布模式下禁用优化,会发生什么?在大多数情况下,这类问题是代码中的一个bug,受调试/发布差异的影响。@jdv JandeVaan我已将其关闭(C++中的优化/链接、启用内部函数、引用、启用COMDAT),但它没有帮助。我已经查看了Walker中的确切路径,它显示exe正在搜索System32中的DLL,而VS是从SysWOW64获取的。但正如我在问题中所述,我已将VS中调试窗口中打印的所有DLL复制到我的exe所在的目录中,因此exe应加载我在那里复制的DLL,但它仍然不起作用。我已将警告级别从3提高到4,但没有什么特别之处。95%未引用的形式参数和一些与计算地形无关的隐式强制转换。此外,我从VS2013运行静态代码分析,但是没有任何未初始化的变量等:/BTW。当我将运行时库设置为多线程/MT(这意味着静态链接)时,甚至会出现此问题,因此所有内容都应该在exe内。我的脑袋爆炸了。有两个建议:首先,从现在开始,MS Windows忽略本地DLL,除非它们与某个证书匹配,这样做的目的是避免使用相同文件名的不兼容库。其次,您可以尝试将渲染的部分记录到一个文件中,并比较不同运行的日志文件。这并不能解释任何事情,但是比较日志文件是一件很容易做到的事情,它可能会提供指向正确方向的指针。你写的最后一段是正确的。精确地说,一个单位化变量被发送到顶点着色器,然后发送到像素着色器,从而导致伪影。不幸的是,静态代码分析在HLSL级别上不起作用,所以它没有告诉我使用未初始化的变量:(。无论如何,谢谢您的时间!
    '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