【问题标题】:GLib-GObject-CRITICAL ... assertion 'quark > 0' failedGLib-GObject-CRITICAL ...断言“夸克> 0”失败
【发布时间】:2018-12-24 23:25:13
【问题描述】:

我对 Gtk 编程相当陌生。我正在使用 Gtkmm 库为我的应用程序编写一个简单的 GUI。

GUI 是一个更大的应用程序的一部分,它实际上编译为两个单独的可执行文件,但我认为这无关紧要,因为这个问题只涉及两个可执行文件之一。

反正我在client.cpp中有如下代码:

#include "client.hpp"

int main() {
    auto builder = Gtk::Builder::create();
}

在 client.hpp 中,我只包含 iostream、glibmm.h 和各种 gtkmm 小部件标头,以及 gtkmm/builder.h。

我的 makefile 是一团糟,但在这里:

CXXFLAGS= -std=c++14 -g
LDFLAGS=-lgmp -pthread $(shell pkg-config -libs gtkmm-3.0)
SERVER_EXE=server
CLIENT_EXE=client
CXX=g++
DIST_DIR=.
BUILD_DIR=./build

SERVER_CXXFLAGS=
CLIENT_CXXFLAGS=$(shell pkg-config --cflags gtkmm-3.0)

INCLUDE_DIRS=./include
INCLUDE_PARAMS=$(foreach d, $(INCLUDE_DIRS), -I$d)

SERVER_OBJECTS=rsa.o server_entry.o server.o
SERVER_OBJECT_PATHS=$(foreach o, $(SERVER_OBJECTS), $(BUILD_DIR)/$o)

CLIENT_OBJECTS=resources.o client.o
CLIENT_OBJECT_PATHS=$(foreach o, $(CLIENT_OBJECTS), $(BUILD_DIR)/$o)

all: $(SERVER_OBJECT_PATHS) $(CLIENT_OBJECT_PATHS)
    mkdir -p $(DIST_DIR)
    $(CXX) $(CLIENT_OBJECT_PATHS) -o $(DIST_DIR)/$(CLIENT_EXE) $(LDFLAGS)
    $(CXX) $(SERVER_OBJECT_PATHS) -o $(DIST_DIR)/$(SERVER_EXE) $(LDFLAGS)

clean:
    rm -rf $(BUILD_DIR)
    rm $(DIST_DIR)/$(CLIENT_EXE) $(DIST_DIR)/$(SERVER_EXE)

$(BUILD_DIR)/%.o: %.cpp
    mkdir -p $(BUILD_DIR)
    $(CXX) -c $< $(INCLUDE_PARAMS) -o $@ $(CXXFLAGS) $(SERVER_CXXFLAGS) $(CLIENT_CXXFLAGS)

resources.cpp:
    glib-compile-resources --target=resources.cpp --generate-source windows.gresource.xml

我意识到这需要考虑很多,因为它实际上是在构建两个可执行文件,但是对于这个问题,您可以放心地只考虑与 client 程序相关的内容。

底部的规则用于将我制作的glade文件转换为可以链接到我的client.cpp文件的c++文件。

无论如何,当我运行我的程序时,我会得到以下输出:

(process:16593): GLib-GObject-CRITICAL **: 23:15:27.886: g_object_set_qdata_full: assertion 'quark > 0' failed

我完全不知道此错误消息可能意味着什么。由于我对这个库不是很有经验,所以我不确定该怎么做。我还尝试在我的代码后添加一行以从资源加载构建器小部件,但这会产生更严重的错误和段错误。我希望如果我能修复第一个错误,其他一切都会到位。有什么想法吗?谢谢!

更新 1:当我将 client.cpp 的源代码更改为 here 提供的源代码时,它可以完美运行!所以这很奇怪..

【问题讨论】:

  • 在环境中设置G_DEBUG=fatal-warningsgdb 下运行您的程序并查看回溯(或在此处发布)。见developer.gnome.org/glib/stable/glib-running.html#G-DEBUG:CAPS
  • @PhilipWithnall 感谢您的回复。我是否认为这样做我输入G_DEBUG=fatal-warnings,然后输入gdb client,然后当gdb运行时我输入'run'然后输入'where'?因为当我这样做时,它只会说没有堆栈。
  • 是的,将它们全部输入一个命令 (G_DEBUG=fatal-warnings gdb ./client) 或先使用 export G_DEBUG=fatal-warnings,然后使用 gdb ./client)。您需要为 GLib 安装调试符号,并使用 -g -O1 编译您的应用程序,以便获得回溯。

标签: c++ gtk3 glib gtkmm


【解决方案1】:

我很确定在调用任何 Glib/Gtk 函数之前,必须使用 Glib::init() 初始化 GLibMM。 Gtk::Application::create() 会为你做这件事,这就是这个例子有效的原因。

【讨论】:

  • 注意有一点笔误,create是小写:Gtk::Application::create(argc, argv);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多