Windows 10 - Ошибка сегментации с использованием библиотеки gtkmm-3.0 и g ++ [воспроизведение включено] - PullRequest
0 голосов
/ 23 февраля 2020

Контекст

Я не большой поклонник спама в StackOverflow с вопросами, но я пытался заставить это работать в течение последних двух дней. Вот так ...

Я придумала небольшую копию файла basi c C ++, который компилирует и отлично работает на Linux ( ubuntu), но компилируется и приводит к немедленному SegFault (или постоянному нарушению доступа, которое, по-видимому, происходит при событии gtkmm l oop) в Windows 10, с использованием компилятора g ++ MSYS2 (mingw64).

Для MSYS2 я использую пакет mingw-w64-x86_64-gtk3, рекомендованный документами. Я думаю, что это проблема в процессе связывания? Не появляется GUI, появляются только ошибки терминала.

Строка, вызывающая проблему , конкретно App::App : myLabel("HelloWorld") {.

Инициализируя список внутри конструктора. с использованием label = Gtk::Label("Hello world!");, программа на самом деле работает также на Windows 10, хотя позже я обнаружил еще один segfault в другой маленькой детали.

Я довольно новичок в 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`

Образец, который segfaults:

#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 строками кадров стека.

Я ценю время, которое вы потратили на чтение этого поста , Хорошего дня!

1 Ответ

0 голосов
/ 02 мая 2020

Загляните в https://developer.gnome.org/gtkmm/stable/classGtk_1_1Label.html Мне кажется, их конструктор не предлагает char* const параметр. Вместо этого используйте myLabel.set_text("HelloWorld");.

...