GLib-GObject-CRITICAL ... утверждение 'quark> 0' не удалось - PullRequest
0 голосов
/ 25 декабря 2018

Я довольно новичок в программировании на 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.

Мой make-файл - беспорядок, но вот он:

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, который я превратил в файл c ++, который можно связать с моим файлом client.cpp.

В любом случае, когда я запускаю свою программу, я получаю следующий вывод:

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

I'mв полной растерянности относительно того, чтоэто сообщение об ошибке может означать.Поскольку я не очень разбираюсь в этой библиотеке, я не совсем уверен, что с ней делать.Я также попытался добавить строку после моего кода, чтобы загрузить виджеты компоновщика из ресурса, но это привело к еще более критическим ошибкам и сбою.Я надеюсь, что если я смогу исправить эту первую ошибку, все остальное станет на свои места.Какие-нибудь мысли?Спасибо!

ОБНОВЛЕНИЕ 1 : Когда я изменяю источник client.cpp на исходный код здесь , он работает отлично!Так странно ..

1 Ответ

0 голосов
/ 26 декабря 2018

Я почти уверен, что GLibMM должен быть инициализирован с Glib::init() перед вызовом любых функций Glib / Gtk.Gtk::Application::Create() и GLib::Application::Create() сделают это за вас, поэтому пример просто работает.

...