簡體   English   中英

Windows 10 - 使用 gtkmm-3.0 庫和 g++ 的分段錯誤 [包括復制]

[英]Windows 10 - Segmentation fault using the gtkmm-3.0 library and g++ [reproduction included]

語境

我不喜歡用問題向 StackOverflow 發送垃圾郵件,但過去兩天我一直在努力讓它發揮作用。 開始...

我想出了一個基本 C++ 文件的小復制品,該文件可以在 Linux (ubuntu) 上完美編譯運行,但在 Windows 上編譯並導致立即出現 SegFault (或似乎發生在 gtkmm 事件循環中的持續訪問沖突) 10 使用 MSYS2 (mingw64) g++ 編譯器。

對於 MSYS2,我使用的是文檔推薦的mingw-w64-x86_64-gtk3包。 我的想法是這是鏈接過程中的問題? 沒有 GUI 出現,只有終端錯誤。

導致問題的行特別是App::App : myLabel("HelloWorld") {

通過使用label = Gtk::Label("Hello world!");在構造函數中初始化列表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 行堆棧幀的漂亮文件。

感謝您花時間閱讀這篇文章。 祝你有美好的一天!

查看https://developer.gnome.org/gtkmm/stable/classGtk_1_1Label.html在我看來他們的構造函數不提供char* const參數。 使用myLabel.set_text("HelloWorld"); 反而。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM