【问题标题】:Windows 10 - Segmentation fault using the gtkmm-3.0 library and g++ [reproduction included]Windows 10 - 使用 gtkmm-3.0 库和 g++ 的分段错误 [包括复制]
【发布时间】:2020-02-23 09:52:01
【问题描述】:

上下文

我不太喜欢用问题向 StackOverflow 发送垃圾邮件,但过去两天我一直在努力让它发挥作用。来了……

我想出了一个基本 C++ 文件的小型复制品,该文件在 Linux (ubuntu) 上编译完美运行,但编译并生成一个 立即 SegFault(或似乎发生在 gtkmm 事件循环上的持续访问冲突)在 Windows 10 上使用 MSYS2 (mingw64) g++ 编译器。

对于 MSYS2,我使用的是文档推荐的 mingw-w64-x86_64-gtk3 包。我的想法是,这是链接过程中的一个问题?没有出现 GUI,只有终端错误。

导致问题的行具体是App::App : myLabel("HelloWorld") {

通过使用label = Gtk::Label("Hello world!"); 在构造函数中初始化列表程序实际上也可以在 Windows 10 上运行,尽管我后来在另一个小细节中发现了另一个段错误。

我对 C++ 很陌生,我的问题是,我的代码中是否做错了什么,或者 gtkmm 库可能没有针对 Windows 进行优化,或者二进制文件已过时?我想对 gtkmm 源代码进行冗长的编译会起作用吗?还是我只是犯了一个愚蠢的指针错误?

复制

MSYS2 设置:

$ pacman -Syu gcc mingw-w64-x86_64-gtk3

编译:

$ g++ -std=c++11 `pkg-config gtkmm-3.0 --cflags` -o app app.cpp `pkg-config gtkmm-3.0 --libs`

段错误的示例:

#include <gtkmm/window.h>
#include <gtkmm/label.h>
#include <string>

// Class prototype
class Window : public Gtk::Window {
  public:
    Window();
    Gtk::Label myLabel;
};

// Entry point, create app and initialise window
int main(int argc, char* argv[]) {
  auto app(Gtk::Application::create(argc, argv, "ch.epfl.cemes.marcus.test"));
  Window window;
  return app->run(window);
};

// Extend Gtk::Window and show some text
Window::Window() : myLabel("Hello world!") {  // this line seems to be the problem
  add(myLabel);
  myLabel.show();
};

在 Windows 上运行上述代码的编译可执行文件会导致以下错误重复填满控制台:

Exception code=0xc0000005 flags=0x0 at 0x0000000100401E9C. Access violation - attempting to read data at address 0x0000000021646CC2

我的主应用程序,实际上是相同的,但被分成了更多的文件,它会立即退出,并显示以下内容:

Exception code=0xc0000005 flags=0x0 at 0x0000000063F14B9D. Access violation - attempting to read data at address 0xFFFFFFFFFFFFFFFF
      0 [main] archipelago 1909 cygwin_exception::open_stackdumpfile: Dumping stack trace to archipelago.exe.stackdump

并生成一个包含 15 行堆栈帧的漂亮文件。

感谢您花时间阅读这篇文章。祝你有美好的一天!

【问题讨论】:

  • 刚刚在 Ubuntu 上尝试过,我确认它没有段错误。
  • 我听说有人对 vcpkg 和 msvc 二进制文件有更好的运气,但 GTKmm 并不是 Windows 优先的库。我希望这只是属于“非常复杂的修复,使用 Qt 或本机”的类别。

标签: c++ windows segmentation-fault g++ gtkmm


【解决方案1】:

查看https://developer.gnome.org/gtkmm/stable/classGtk_1_1Label.html 在我看来,他们的构造函数不提供 char* const 参数。请改用myLabel.set_text("HelloWorld");

【讨论】:

  • 确实如此。它使用glib::ustring,它确实提供了glib::ustring(const char* src) 的构造函数。我会假设编译器能够处理这些隐式转换?
  • 你是对的!我的回答不正确。我在 Linux + valgrind + 额外的编译标志上尝试了你的代码,没有问题! myLabel.set_text("HelloWorld"); 你有同样的崩溃吗? ?
  • 刚刚用上面的示例再次尝试确认,set_text 也会导致访问冲突(segfault),没有初始化列表。删除set_text 行(空白标签)将显示一个空窗口?。无论如何,感谢您的帮助,我希望我遗漏了一些明显的东西。对于 GTKmm,我会坚持使用 Linux。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2011-07-14
  • 1970-01-01
  • 2020-02-18
  • 2017-07-30
相关资源
最近更新 更多