Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++ 在没有安装程序的情况下部署_C++_Windows_Deployment - Fatal编程技术网

C++ 在没有安装程序的情况下部署

C++ 在没有安装程序的情况下部署,c++,windows,deployment,C++,Windows,Deployment,我正在做一个非常小的windows应用程序,它只包含一个可执行文件。由于该程序将驻留在SD卡上,我希望该应用程序尽可能自我包含,我不希望有安装程序。我希望用户能够简单地将可执行文件复制到SD卡上,并且能够直接运行它,而不需要做任何额外的事情。问题是,我的程序是用VS2008编译的,它需要CRT的版本,我不能保证安装了这些版本。我正在静态链接到CRT,我错误地认为它可以避免这个问题。我一直在考虑追踪一些较旧的VS版本,但我感觉这是一条不正确的道路。我希望该程序在新安装的windows xp及以上版

我正在做一个非常小的windows应用程序,它只包含一个可执行文件。由于该程序将驻留在SD卡上,我希望该应用程序尽可能自我包含,我不希望有安装程序。我希望用户能够简单地将可执行文件复制到SD卡上,并且能够直接运行它,而不需要做任何额外的事情。问题是,我的程序是用VS2008编译的,它需要CRT的版本,我不能保证安装了这些版本。我正在静态链接到CRT,我错误地认为它可以避免这个问题。我一直在考虑追踪一些较旧的VS版本,但我感觉这是一条不正确的道路。我希望该程序在新安装的windows xp及以上版本上运行


非常感谢您的帮助。

使用
/MT
/MTd
(用于调试)静态链接到CRT应该完全满足您的需要

事实上,这并不意味着仍然有一些东西依赖于动态库。如果您有一些没有使用静态CRT编译的附加DLL,就会出现这种情况

您可以使用确定哪些DLL使用哪些DLL,以及哪些DLL仍然依赖于动态CRT或任何其他DLL


另一种方法是从调试器运行exe,并查看输出窗口中正在加载哪些DLL。dependens.exe只提供启动时加载的DLL,这会为您提供一些仅在运行时加载的附加依赖项。

如果您希望链接到CRT库的DLL版本,并且希望避免安装任何内容,则需要将CRT程序集的每个成员复制到与可执行文件相同的文件夹中。这可能不是微软推动你的方式,但它是有效的,而且确实有效


在Visual Studio 2008安装目录中,您应该可以找到一个文件夹:
VC\redist\x86\Microsoft.VC90.CRT
。如果将该文件夹(包括清单文件)的完整内容复制到与可执行文件相同的目录中,则应该能够从该位置运行可执行文件。

遗憾的是,依赖项遍历或调试器方法不够。动态加载CRT库时,它们会执行一些检查。您需要有程序集清单文件存在,并且程序集的每个成员都存在(无论是否确实需要),或者它们生成类似“请求以异常方式终止运行时”的错误。清单不能嵌入到EXE中吗?这不是Visual Studio中的默认设置吗?@AshleysBrain:可以,默认情况下是,但如果您的exe清单引用CRT程序集,则该程序集也必须存在并完整,包括其清单,并且CRT程序集清单是VS2005和VS2008中的外部清单。那么您还使用了哪些库?如果静态链接到语言运行库,则不必将其捆绑在一起。那么您还有什么其他依赖项呢?静态链接运行时应该可以避免这个问题。您需要跟踪运行时仍处于动态链接状态的原因。