我面临一个相当特殊的问题:我有一个Qt C ++应用程序,以前工作正常。现在,突然间我再也无法启动了。没有错误,没有任何错误。
更多信息:
该程序' [4456] App.exe'退出时使用代码-1(0xffffffff)。
我没有想法。关于尝试或看什么的任何指示?一个可执行文件如何突然停止工作而没有错误?
答案 0 :(得分:1)
我最终找到了这种行为的原因......有点儿。编码(例如我的单身人士)从来都不是问题(正如我预期的那样,因为代码总是有效)。相反,外部库(SAP RFC SDK)引起了麻烦。
此库依赖于ICU Unicode库以及明显特定的版本。由于我不知道这个事实,我只有我目前在我的应用程序目录中使用的Qt版本所需的ICU库。到目前为止,必须从标准的Windows路径加载SAP RFC SDK的ICU库。
最后,一些软件更改(Windows更新,手动应用程序卸载等)必须删除那些导致描述静默失败的库。只需将所需的ICU库版本DLL复制到我的应用程序文件夹中,就可以解决问题。
我唯一不确定的是,当通过DependencyWalker跟踪加载的DLL时,这是不可见的。
答案 1 :(得分:0)
“永远不会调用实际应用程序代码(= main()中的第一行)。因此无法进行调试。”
您可能有一些静态存储初始化失败,这是在调用main()
之前应用的。
您是否在代码中使用任何相互依赖的单身人士?如果是这样,请将它们合并为单个单例(请记住,不应超过一个单例)。
另请注意,对于这种情况,调试仍然可能很好,陷阱是, - 对于我的答案中描述的情况 - ,main()
的主体的第一行被设置为第一个中断当您在调试器中启动程序时,默认为point
没有什么阻碍你设置断点,在实际开始代码达到main()
之前就会遇到断点。
至于您对评论的澄清:
“我确实使用一些单身人士......”
如上所述,如果您确定需要使用单身人士,请使用单人。
否则你最终可能会遇到未定义的静态存储初始化顺序。
无论如何,如果静态存储数据相互依赖,在整个代码中为它提供单一访问点,那么这并不重要,以避免因与各种各样的重度耦合而混淆它实例
与单个实例耦合,可以更容易地重构代码以使用接口,如果事实证明 singleton 不是一个。