Gif*_*guy 14 c++ compiler-construction optimization linker infinite-loop
我正在VS2010发布模式中编译一个非常小的Win32命令行应用程序,所有速度优化都打开(而不是内存优化).
此应用程序旨在用于单一目的 - 执行单个预定义的复杂数学运算,以找到针对特定问题的复杂解决方案.该算法完全正常运行(已确认),并且在调试模式下编译并运行良好.但是,当我在发布模式下编译时(算法足够大以利用优化),Link.exe似乎无休止地运行,代码永远不会完成链接.它的CPU使用率为100%,内存使用率没有变化(43,432 K).
我的应用程序只包含两个类,这两个类都是非常短的代码文件.但是,该算法包含20个左右的嵌套循环,每个层内都有内联函数调用.链接器是否尝试通过这些循环运行每个可能的路径?如果是这样,为什么Debug-Mode链接器没有任何问题?
这是一个很小的命令行应用程序(2KB exe文件),编译时间不应超过几分钟.到目前为止,我已经等了30分钟,没有任何变化.我正想着让它一夜之间链接,但如果它真的是试图通过在算法的所有可能的代码路径来运行它可能最终没有派上用场一台超级计算机连接了几十年.
我需要做些什么才能让链接器脱离这个无休止的循环?这样的代码是否有可能在链接循环之前创建无限链接循环而不会出现编译器错误?
编辑:
Jerry Coffin指出我应该杀死链接器并再次尝试.我忘了在原帖中提到这个,但是我已经中止了构建,关闭并重新打开VS,并尝试多次构建.问题是一致的,但我还没有更改任何链接器选项.
EDIT2:
我也忽略了我删除了"Debug"和"Release"文件夹并从头开始重新构建的事实.结果相同.
EDIT3:
我刚刚确认关闭函数内联会导致链接器正常运行.问题是我需要函数内联,因为这是一个性能非常敏感的操作,内存占用最少.这让我想问,为什么内联会导致这样的问题发生?
EDIT4:
在无限链接周期中显示的输出:
Link:
Generating code
Run Code Online (Sandbox Code Playgroud)
编辑5:
我确认将所有代码放入单个CPP文件并没有解决问题.
你重建了吗?如果其中一个目标文件或 .ilk 文件损坏(尽管发布模式可能没有使用其中一个,但我无法确定您的项目设置),那么重建所做的清理过程应该可以修复它。
仅当调试(或图形设计器之一)保持构建产品的打开句柄时,关闭并重新打开 Visual Studio 才有用。
这就引出了另一个建议——检查任务管理器并确保您没有仍在运行的应用程序的副本。