Я довольно новичок в программировании на 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 на исходный код здесь , он работает отлично!Так странно ..