【发布时间】: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