如何在main()

时间:2017-02-05 20:21:19

标签: c++ windows qt

我在Windows 8.1上使用QtCreator和visual studio 2015套件来构建我在Linux上开发和测试的程序,在linux上它可以正常工作,但在Windows上它只是立即崩溃,而我不知道该找什么。

除了QT我使用的唯一外部库是opengl和glew,所以我不认为它是那些。

有没有什么可以在GNU C ++中工作但在MSVC中立即崩溃?

4 个答案:

答案 0 :(得分:1)

通常这种崩溃与您的程序完全无关。它是一个连接问题的外部库。我最近在OpenSplice DDS库中遇到过这个问题。我链接到一个在任何事情开始之前导致分段错误的库。我通过逐个链接预编译的库解决了这个问题,并检查每个是否修复了该程序。

我建议您做的是:逐步删除您要链接的库和资源,直到您的程序启动并打印“Hello world"从main()的第一行开始。

另一种方法是,制作一个新的空程序,并链接您在程序中使用的相同资源。这更容易,因为它不涉及修改您的程序。

答案 1 :(得分:1)

这就是我要做的。

首先从干净状态重建整个解决方案或项目。以防万一这只是一些奇怪的依赖问题导致某些东西无法重新编译。永远不会伤害。

正如Neil在对该问题的评论中所说,崩溃可能来自一个全局变量,其构造函数在main或WinMain之前运行。您确定没有声明为“静态”的东西或者可能具有构造函数的全局范围吗?

现在执行以下操作:

  • 打开Visual Studio。

  • 从菜单中选择文件 - >打开 - >项目/解决方案...

  • 弹出文件打开对话框时,选择Qt生成的EXE 造物主。 (这是对的 - 你打开EXE作为一个项目)。该目录通常是Qt项目上方的一个文件夹级别(.. \ build-yourapp-Desktop_Qt_5_7_0_MSVC2015_32bit-Debug \ debug)

  • 现在按绿色箭头开始调试(menu-> Debug-> Start 调试)。如果一切顺利,您的计划将提前失败并

现在很可能在Visual Studio下程序根本无法运行,因为Qt Creator不会将所有Qt * .dll二进制文件复制到您的构建目录中。你会得到一堆对话框,说“程序无法启动,因为无法找到Qt5-XYZ.dll”。通过以下任何一种方式更新PATH环境可以轻松解决此问题,以便将Qt5.x.0\5.x\msvc2015\bin文件夹包含在PATH中。

  • 您可以从命令linke添加它,然后从命令行重新启动devenv.exe。

  • 您可以从控制面板全局添加 - >系统 - >高级。然后从Windows桌面重新启动Visual Studio。

  • 在Visual Studio中打开EXE调试项目,只需右键单击项目名称(不是父解决方案),弹出一个对话框,允许您编辑启动设置。其中一个是环境。

那应该这样做。从那里,您可以在EXE上启动调试器,根据需要设置断点,并在崩溃时分析调用堆栈。

答案 2 :(得分:0)

这很简单:使用调试信息构建您使用的所有库(包括Qt)(只要生成PDB文件,这些库就可以是发布版本)。然后在调试器下运行您的应用程序(例如Qt Creator下的F5),它将在崩溃时停止。

main之前运行且已知会导致问题的代码将是全局对象初始化:您可能会遇到static initialization order fiasco

答案 3 :(得分:0)

该问题的另一个原因可能是堆栈溢出。在Linux中,默认情况下,堆栈大小通常为8 MB,而在Windows中,堆栈大小仅为1 MB。

尝试与/ STACK:8388608开关链接。如果可行,您可以考虑在堆上分配更多数据,并保持默认堆栈大小为1 MB。