语境
我不是非常喜欢向Stack垃圾邮件发送问题,但在过去的两天里,我一直在努力使它工作。开始...
我想出了一个基本C++文件的小幅复制,它的编译了,而在Linux(ubuntu)上完美地运行了,但是编译并导致了立即出现SegFault (或似乎经常发生的访问冲突) Windows 10上使用MSYS2(mingw64)g++编译器的gtkmm事件循环)。
对于MSYS2,我使用的是docs建议的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行堆栈帧的精美文件。
感谢您花时间阅读这篇文章。祝你有美好的一天!
最佳答案
看看https://developer.gnome.org/gtkmm/stable/classGtk_1_1Label.html
在我看来,他们的构造函数不提供char* const
参数。请改用myLabel.set_text("HelloWorld");
。
关于c++ - Windows 10-使用gtkmm-3.0库和g++的段错误[包括复制],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60360990/