我正在 vc2008 中构建我的应用程序并在机器网络上对其进行测试。
除了安装 Visual Studio 2008 之外,还有什么方法可以在另一台机器上运行 C++ 程序的调试版本?(即没有安装vc2008)
安装 redist 软件包只会安装 vc2008 程序的发布模式支持 DLL。目前它抱怨“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”,我认为这是“我缺少 DLL”的代码。
我正在 vc2008 中构建我的应用程序并在机器网络上对其进行测试。
除了安装 Visual Studio 2008 之外,还有什么方法可以在另一台机器上运行 C++ 程序的调试版本?(即没有安装vc2008)
安装 redist 软件包只会安装 vc2008 程序的发布模式支持 DLL。目前它抱怨“此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。”,我认为这是“我缺少 DLL”的代码。
你不能,因为调试运行时没有安装程序 redist(实际上软件许可证禁止分发它,所以即使你确实把一些东西放在一起,你也会违反 EULA)。但是,“调试构建”通常涉及 4 个单独的选项,另外 3 个不影响分发应用程序。
生成一个允许符号调试的 .pdb 文件(cl /Zi 和链接 /DEBUG)。您可能希望将 /OPT:ref 添加到链接器选项;链接器在不创建 .pdb 文件时会丢弃未引用的函数,但在 /DEBUG 模式下它会保留所有函数(因为调试符号引用了它们),除非您明确添加它。
我通常对我的所有构建都执行此操作,甚至是生产版本。只要您使用 /OPT:ref 重新打开链接器优化,它就不会真正花费任何成本,如果您最终想要读取故障转储,拥有这些符号会很方便。
使用 C 运行时库的调试版本(可能是 MSVCR*D.dll,但这取决于您使用的运行时)。这归结为 /MT 或 /MTd (或其他东西,如果不使用 dll 运行时)。
这意味着你不能再重新分配东西了。它还对某些库函数的性能产生巨大影响,尤其是内存分配。调试运行时版本小心地用值“毒化”它们接触的内存以清除未初始化的数据错误,发布版本通常保留旧数据以节省接触它的时间。我相信使用 MSVCP* STL 实现,调试版本也省略了所有通常完成的分配池,因此泄漏检查器可以准确地显示您认为的块,而不是它一直在分配的更大的内存块,但这意味着它会在更慢的情况下对 malloc 进行更多调用。如果你有指针或迭代器处理错误,这可能会影响你得到什么样的不当行为。
关闭编译器优化 (/Od)。
这个做了很多事情(这个问题对这个主题有一些很好的讨论),但基本上它会损害性能。很多。不幸的是,如果您希望单步运行顺利,则需要它。
设置预处理器#defines DEBUG 或 NDEBUG。
这以各种方式影响了许多库,但最值得注意的是它编译或消除了 assert() 和朋友。
因此,您可能会考虑使用这些选择的较少组合进行构建。我大量使用具有符号(/Zi 和链接 /DEBUG)和断言(/DDEBUG)的构建,但仍然优化(/O1 或 /O2 或您使用的任何标志)但堆栈帧指针保留用于清除回溯 (/Oy-) 并使用正常的运行时库 (/MT)。这与我的发布版本接近并且是半可调试的(回溯很好,单步执行在源代码级别有点古怪;组装级别当然可以正常工作)。你可以有很多你想要的配置;只需克隆您的发行版并打开调试的任何部分似乎有用。
唯一会影响尝试重新分发应用程序的是 2。
如果您尝试在另一台机器上进行调试,您可能也对msvsmon感兴趣。
当然,您始终可以将程序配置为在 CRT 中静态链接,而不是使用 DLL。
这样,您就避免了必须确保正确安装调试 DLL 的麻烦(无论是在设置方面还是在没有再分发许可证方面)。
只需将“运行时库”的代码生成设置更改为“多线程调试 (/MTd)”或使用命令行上的“/MTd”选项。
阅读这篇博文,了解您需要哪些文件才能运行应用程序的调试风格以及从何处获取这些文件。但是,您不能正式将它们重新分发给第三方。
如果您有应用程序的安装程序,还可以构建一个合并模块,以便在没有 Visual Studio 的计算机上部署调试运行时。当然,这仅用于测试目的。合并模块位于C:\Program Files\Common Files\Merge Modules
.