TL; DR 程序适用于一个系统。在家庭系统上,它在到达主入口点之前挂起(使用调试器检查)。
我有一个组项目的本地代码存储库,同步到我在其他几台机器(包括Linux,Windows和Mac)上测试过的最新版本,我确信这些机器可以正常工作而不会产生任何令人讨厌的错误。这是一个相当简单的计划,我们已经处理的主要技术挑战是在SDL2中进行链接,这很容易。
该程序在我的本地计算机上完美编译,即使尽可能多地打开警告标志,也不会发出任何警告或错误。我已经确保我不小心使用来自不同系统的.o文件并且我已经清理过,然后重新编译了几次代码。我已经将我的本地存储库恢复为项目中的旧代码,我之前也确定这些代码已编译并在我的本地计算机上运行。
我确保gcc中外部库的链接工作正常,并且没有任何警告或错误。最终将.o文件链接在一起也是错误和无警告。
我已经为我正在运行的程序重新安装了所有相关的.DLL(在这种情况下,唯一的DLL是SDL),无论是在逻辑系统位置还是工作目录中已编译的可执行文件。我确保.DLL是正确的位版本,甚至尝试了错误的位版本,以防我不小心制作了需要其他位版本的版本。
我已经重新安装了我的编译器(目前我从Msys2获得),而且我尝试使用来自Mingw64的编译器。
这些都没有任何区别。当我去运行可执行文件时,什么都不会发生。没有创建任何进程,我运行它的任何终端窗口都会挂起,直到我强行关闭它(它不会响应ctrl-c)。
如果我尝试在调试模式下运行它,gdb将能够打开可执行文件,并提供所有信息,但是一旦我尝试运行它,它就会像终端窗口一样挂起。即使我试图在入口点打破它,该程序似乎永远不会进入入口点,因为它仍然挂起。
此问题完全随机启动。我从大学回到家,在那天我上大学之前一直在研究代码,并把它留在可编辑的状态,回到家里,点击make并且它不会运行。这甚至在我取消了我们已经提交的那些变化并推动那一天之前,这就是为什么我完全失去了为什么这将如此快乐地编译,但绝对拒绝在任何条件下运行。
答案 0 :(得分:1)
如果调试器未到达主入口点,那么我能想到的最可能的罪魁祸首是static initialization fiasco,这与您描述的行为一致:在一个系统上工作,在另一个系统上失败。< / p>
没有看到任何代码,我们只是在黑暗中投掷箭头。
C vs C ++:
静态初始化fiasco仅适用于C ++,但请记住,库,甚至链接到C程序的库都可以包含C ++代码(不一定作为接口公开)。
务必检查Is there any way a C/C++ program can crash before main()?。
@JohnBollinger有一个很好的评论:检查一个简单的程序(使用相同的编译器和标志编译)是否运行。我们有时会专注于我们认为问题的位置,我们很容易错过这样的事情。
您可以做的另一件事是使用ldd
查看是否有正确的库链接到您的程序。