C ++ & Clion & GTK3 & сигнал поляны не работает - PullRequest
0 голосов
/ 04 мая 2018
#include <gtk/gtk.h>

G_MODULE_EXPORT void on_login_window_destroy()
{
    gtk_main_quit();
}

int main (int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkBuilder *builder;
    GtkWidget *window;

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "../layout.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "login_window"));
    gtk_builder_connect_signals(builder, NULL);

    g_object_unref(builder);

    gtk_widget_show(window);

    gtk_main();
    return 0;
}

это мой main.cpp

и

cmake_minimum_required(VERSION 3.6)
project(Chat)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -rdynamic")

set(SOURCE_FILES main.cpp)
add_executable(Chat ${SOURCE_FILES})

find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK3 REQUIRED gtk+-3.0)

include_directories(${GTK3_INCLUDE_DIRS})
link_directories(${GTK3_LIBRARY_DIRS})

add_definitions(${GTK3_CFLAGS_OTHER})

target_link_libraries(Chat ${GTK3_LIBRARIES})

это мой CMakeLists.txt Шаблон Glade работает и окно показывает, но сигнал не работает. Я получил ниже ошибки:

(Chat:19486): Gtk-WARNING **: 11:44:05.546: Could not find signal handler 'on_login_window_destroy'.  Did you compile with -rdynamic?

Я использовал флаг -rdynamic, но все еще получал ту же ошибку.

Но приведенный ниже код работает в терминале. Мне нужно было бы либо заставить CMake работать под кодом ниже, чтобы он работал, или как вы думаете .?

gcc -o Chat main.cpp -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

Я использую UBUNTU 18.04 со всеми библиотеками (я так думаю.)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Для чего бы то ни было, у меня возникла точно такая же проблема (и сообщения об ошибках), хотя с gtk-2.0. Что решило эту проблему в macOS, так это использование модуля FindGTK2 напрямую, а не команды pkg-config. Например:

find_package(GTK2 REQUIRED gtk glade)
if(GTK2_FOUND)
    include_directories(${GTK2_INCLUDE_DIRS})
    link_libraries(${GTK2_LIBRARIES})
    add_definitions(${GTK2_DEFINITIONS})
endif()

В Linux мне также пришлось добавить set(CMAKE_EXE_LINKER_FLAGS "-rdynamic")

0 голосов
/ 06 мая 2018

Я думаю, что после многих поисков ... Я обнаружил, что это работает только с c, и я проверил это; признано правдой. поэтому я использую gtkmm.h, который, кажется, работает как ожидалось.

...