我在C#中编写了一个可移植程序,它具有某些依赖项(.NET Framework,Visual C ++可再发行组件等),可以在Windows XP SP3及更高版本上运行。
因此,程序需要一个启动程序,它将在实际程序执行之前每次运行,检查是否已安装所有必需的依赖项。如果缺少任何依赖项,将提供下载和安装该依赖项的选项。如果没有缺少依赖项,则执行实际程序。
启动程序本身相对简单,包括一些注册表检查和一些WinAPI调用,以验证已安装的依赖项。
最后的文件结构如下所示:
C#_compiled_portable_program.exe
C++_compiled_launcher.exe // executes on any system as low as a clean Windows XP SP3 install
问题在于我不知道如何在Visual Studio 2013中编译C ++代码,该代码将以绝对最小的依赖性运行(至少在Windows XP SP3附带的运行时库上运行)。
以绝对最简单的C ++代码为例:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello world!");
return 0;
}
如果我使用默认配置的Visual Studio 2013编译它,它将不会在没有安装VC ++ 2013的机器上执行,显示一些令人讨厌的错误。
我四处寻找类似的问题,而我能找到的最接近的问题就是 Visual Studio 2010 MSVCR dependency removal?,但答案不完整或过时。
因此,就像安装程序一样,是否可以在Visual Studio 2013中编译一个几乎可以在任何系统上运行的C ++项目?
答案 0 :(得分:0)
这不是完美的,但现在也会这样做。
这就是我在Visual Studio 2013中编译的C ++项目所做的,执行没有安装VC ++ 2013的系统。
我在Visual Studio 2013中创建了一个新的C ++项目File>New>Project>Visual C++>Win32 Console Application
然后在Solution Explorer
中右键单击该项目,然后选择Properties
点击Configuration
下拉菜单,然后选择All Configurations
在Configuration Properties>General
中,将Platform Toolset
设置为Visual Studio 2013 - Windows XP (v120_xp)
。
使用Dependency Walker确定编译的exe导入哪些模块(发布版本,而不是调试版本)。导入的模块应为:
KERNEL32.DLL
是一个系统文件,因此我们不必担心,MSVCR120.DLL
是Visual C ++ 2013运行时库,我们需要将此文件与发布版本一起分发。当可执行文件需要加载模块时,它首先查看该文件的当前位置,然后查看PATH
(System32等)。如果我们将MSVCR120.DLL复制到版本可执行文件的相同位置,那么即使在没有安装VC ++ 2013的系统上,程序也会运行。
由于项目是32位应用程序,请下载VC++ 2013 Redistributable x86,将其安装在32位版本的Windows上(我将其安装在新的Windows XP虚拟机上),然后复制c:\windows\system32\MSVCR120.DLL
<强>更新强>
没关系。您不必分发VC ++ Runtime DLL文件的副本,只需将项目配置为静态链接到运行时库。
Here解释了如何做到这一点。如果你计划在Windows XP上执行,你仍然需要更改Platform Toolset
。