部署使用 C++ 开发的应用程序
Posted
技术标签:
【中文标题】部署使用 C++ 开发的应用程序【英文标题】:Deploying application developed using C++ 【发布时间】:2010-11-28 12:53:01 【问题描述】:我有一个使用wxWidgets
作为 UI 框架并在 Windows 7 机器上使用 Visual Studio 2010 编译的应用程序。我正在静态链接wxWidgets
。我的应用程序还使用 C dll 进行处理。
现在我正尝试在另一台新安装的机器 (Win7) 上运行此应用程序。这没有开发人员环境设置。我已将应用程序的可执行文件、支持 dll 和其他支持文本文件复制到这台机器上。
当应用程序启动时,它给出了以下消息。
The program failed to start because MSVCR100d.DLL is missing from your computer. Try reinstalling the program to fix this problem
.
我认为我的 C 库正在使用调试版本并在 Release
模式下编译它解决了这个问题。但它仍然要求MSVCR100.dll
。我认为解决方法是安装 VC++ 可再发行包。但不确定这是最好的方法。
这是我的问题。
-
您通常如何部署应用程序?你们也提供 VC++ 可再发行包吗?
我在 64 位机器上编译它并在 32 位机器上测试。这个可以吗?还是需要单独编译32位?
我可以静态链接到运行时库吗?这样我就可以发送我的 DLL 和其他文件了。
在构建可在多台机器上运行的可执行文件时,我还应该注意哪些其他常见事项?
以下是我的一些可能相关的设置。
General :
Use of MFC : Use standard windows libraries
Use of ATL : Not using
C/C++ :
Runtime library : Multi-threaded(/MT)
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:它试图在没有它的机器上使用仅调试 DLL。
您的问题源于 msvcr100d.dll 是一个仅由尾随 d 指示的调试 dll。
因此,您没有使用 /MT,而实际上是在使用 /MDd。如果您使用 /MT,那么它不会尝试加载该 DLL ...
所以回答你的问题:
-
我更喜欢静态链接到运行时。
这真的不是问题。只是不要尝试在 32 位操作系统上运行 64 位编译的二进制文件。
是的。
注意您的最低规格。即如果您需要支持 Pentium 3 ... 等,请不要使用 SSE4。
【讨论】:
谢谢。我还阅读了有关完全避免使用 MS 编译器并在 MinGW 上使用 GCC 的信息。您对此有何看法? @Appu:MSVC 编译器非常好用。几乎/没有理由改变。 @Appu:我同意 DeadMG。值得注意的是,如果你参加了 GCC 培训,那么你会发现 Visual Studio 让你的生活变得轻松许多。我会很乐意处理任何一个,但我宁愿只处理 Developer Studio :) 谢谢。但是我的问题还没有完全解决。如何静态链接运行时? @Appu:通过使用 /MT 开关(项目属性->配置属性->C/C++->运行时库设置为“多线程”)。这静态链接到运行时。我知道你说你已经在这样做了,但如果它试图使用 DLL,你显然不会......确保你这样做是为了调试(尽管调试将使用 /MTd)和发布(即使用 /MT )。【参考方案2】:这似乎与我在谷歌上搜索“x86 exe 是否可以在 x64 上工作”时的第二次点击是同一个问题;它不能回答所有问题,但它有一些答案。
http://social.msdn.microsoft.com/Forums/en/netfx64bit/thread/5ad0ff2c-558c-43ba-a59d-9cd0a0785103
如果您超越第二个,并且查询其他一些内容,您可能会找到更多类似的信息。
至于 VC++ 运行时的东西,我自己像瘟疫一样避免使用 MS 的 C++ 版本,所以没有使用它的经验,但是,我仍然认为所有现代 Windows 计算机都应该具有所有东西的必要运行时组件(VC++ 、.NET 等)已包含在内。
【讨论】:
在 Windows 中使用 C 和/或 C++ 编程时,如何避免 MS 的运行时版本? 我不只为 Windows 开发。此外,仅仅因为您为 Windows 开发了一些东西,并不意味着您需要 VC++ 运行时; x86 指令不关心运行它们的操作系统。 VC++ 运行时是 Windows 系统库的同义词吗?仅仅因为我包含 windows.h 并使用 Sleep(),那是否需要 VC++ 运行时?如果我然后使用 WinAPI 设置 GUI 窗口,是否需要 VC++?我认为不会,但 MS 确实将一些他们可能不应该的东西集成到 OS/shell 操作中,所以也许 VC++ 运行时真的是 Windows 系统调用的代名词。 评论太短;通常我不喜欢这样做,但我觉得流血到第二个是有益的,因为我在第一个上用完了字符。显然,如果您使用 VC++ 制作应用程序,无论如何它可能都需要它们的运行时。即使用 C++ for Windows 开发,我也不使用 VC++。我使用 MinGW。但同样,这个问题很重要,并且可能值得自己提出问题:应用程序需要的 VC++ 运行时到底是什么?是否需要任何 Windows 特定的东西(WinAPI f.ex. Sleep() CreateWindow() 等),还是只是支持? @Loduqijk:VC++ 运行时是 CRT,还有一些 C++ 特性,如异常、RTTI、dynamic_cast 之类的。任何没有从头开始编写自己的 CRT(或者由编译器供应商完成,我猜)的 Windows 应用程序都使用 VC++ 运行时。 WinAPI 和 VC++ 运行时是完全独立的东西——你不需要 VC++ 来调用 Sleep()。 Windows 7 在 MSVC10 之前发布。它可能带有 MSVC9 运行时。我个人总是静态链接。【参考方案3】:是的,必须提供 VC++ 可再发行包。最好的方法是使用 Visual Studio Setaul 和 Deployment 项目制作安装包。
编译32位可执行就可以了。
我不推荐这个,这么大的可执行文件看起来不专业。
【讨论】:
TBH 他们最终不会那么大。链接剥离器消除了很多摩擦。与必须向人们发送 vcredist 安装程序包相比,它的重新分发规模要小得多。 我不记得上次我认为“巨大”的可执行文件不专业是什么时候。真是一分钟,我不记得上次检查可执行文件的文件大小是什么时候了...以上是关于部署使用 C++ 开发的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
linux C++独立程序部署路径问题/opt/yourprogram(项目目部署目录项目部署路径程序部署位置项目部署位置)