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