【问题标题】:C program compiles without errors but will not run and gives no warnings or errors [closed]C程序编译没有错误但不会运行并且没有警告或错误[关闭]
【发布时间】:2016-02-14 10:41:24
【问题描述】:

TL;DR 程序在一个系统上运行。在家庭系统上,它在到达主入口点之前挂起(用调试器检查)。


我有一个用于小组项目的本地代码存储库,已同步到我在其他几台机器(包括 Linux、Windows 和 Mac)上测试过的最新版本,我确信这些版本可以正常工作而不会出现任何令人讨厌的错误。这是一个相当简单的程序,我们处理的主要技术挑战是在 SDL2 中进行链接,这相当容易。

该程序在我的本地计算机上完美编译,即使打开了尽可能多的警告标志,也不会引发任何警告或错误。我确保我不会意外使用来自不同系统的 .o 文件,并且我已经清理然后重新编译了几次代码。我已将我的本地存储库恢复为项目中的旧代码,我也确信这些代码之前已编译并在我的本地计算机上运行。

我已确保 gcc 中外部库的链接工作正常,并且没有由此产生的警告或错误。 .o 文件的最终链接也没有错误和警告。

我已经为我正在工作的程序重新安装了所有相关的 .DLL(在这种情况下,唯一的 DLL 是 SDL),包括在逻辑系统位置和已编译可执行文件的工作目录中。我确保 .DLL 是正确的位版本,甚至尝试了错误的位版本,以防我不小心制作了需要其他位版本的版本。

我已经重新安装了我的编译器(我目前是从 Msys2 获得的),并尝试使用来自 Mingw64 的编译器。

这些都没有任何区别。当我去运行可执行文件时,什么都不会发生。没有创建任何进程,并且我从中运行它的任何终端窗口都会挂起,直到我强制关闭它(它不会响应 ctrl-c)。

如果我尝试在调试模式下运行它,gdb 将能够打开可执行文件,并为我提供所有信息,但是一旦我尝试运行它,它就会像终端窗口一样挂起。即使我尝试在入口点中断它,程序似乎也永远无法到达入口点,因为它仍然挂起。

这个问题完全是随机开始的。我从大学回家,那天我上大学之前一直在编写代码,并将它留在可编译状态,回到家,点击 make 并且它无法运行。这甚至是在我取消我们当天提交并推送的更改之前,这就是为什么我完全不知道为什么它会如此愉快地编译但绝对拒绝在任何条件下运行。

【问题讨论】:

标签: c gcc sdl sdl-2


【解决方案1】:

如果调试器没有到达主入口点,那么我能想到的最可能的罪魁祸首是static initialization fiasco,这与您描述的行为一致:在一个系统上工作,在另一个系统上失败。

没有看到任何代码,我们只是在黑暗中扔箭。

C 与 C++:

静态初始化失败仅适用于 C++,但请记住,库,甚至链接到 C 程序的库也可以包含 C++ 代码(不一定公开为接口)。

请务必查看Is there any way a C/C++ program can crash before main()?

@JohnBollinger 有一个很好的评论:检查一个简单的程序(使用相同的编译器和标志编译)是否运行。我们有时会专注于我们认为问题所在,我们很容易错过这样的事情。

您可以做的另一件事是使用ldd 查看是否将正确的库链接到您的程序。

【讨论】:

  • 这是一个 c++ 问题...
  • @EOF 没有读取C 标签....将删除答案....
  • 好吧,也许标签不正确..
  • 链接的库也可以包含c++目标代码
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2011-03-03
  • 2018-12-28
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多