2017-09-09 2 views
0

Ich benutze mit Windows 8.1 OS. Beide MinGW- und GTK-Pfade werden zu meiner Pfadumgebungsvariablen hinzugefügt. Ich habe Probleme, meinen Code mit den gtk-Bibliotheken zu verknüpfen.Ich kann gtk GUI nicht mit cmake und MinGW gcc Compiler

hier ist die CMakeLists

# Set project 
cmake_minimum_required(VERSION 3.0) 
project(gtk-test C) 

# Configure project paths 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) 
set(CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src) 

# Find dependencies 
find_package(PkgConfig REQUIRED) 
pkg_check_modules(GTK3 REQUIRED gtk+-3.0) 
link_directories(${GTK3_LIBRARY_DIRS}) 
add_compile_options(${GTK3_CFLAGS_OTHER}) 
set(LIBRARIES ${LIBRARIES} ${GTK3_LIBRARIES}) 

set(FLAGS "-I${GTK3_INCLUDE_DIRS}") 
message(STATUS "Flags: ${FLAGS}") 
string(REPLACE ";" " -I" FLAGS "${FLAGS}") 
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} ${GTK3_FLAGS} ${FLAGS}) 

# Compile 
add_executable(main ${PROJECT_SOURCE_DIR}/example.c) 
target_link_libraries(main ${LIBRARIES}) 

hier ist die Patch-Datei, die ich zu bauen verwenden.

@echo off 

set CMAKE_PATH=%~dp0..\Tools\CMake\bin 
set MAKE_PATH=%~dp0..\Tools\Make 
set PKG_CONFIG_PATH=C:\gtk3\lib\pkgconfig 
set PATH=C:\gtk3\bin;%PATH% 
set PATH=%PATH%;%CMAKE_PATH%;%MAKE_PATH% 
rd /s /q .\Builds 
mkdir Builds 
cd Builds 
cmake .. -G "MinGW Makefiles" 
cmake .. -G "MinGW Makefiles" 
call mingw32-make all -j4 

cd .. 

Hier ist der GUI-Code, den ich versuche zu bauen.

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
GtkBuilder *gtkBuilder; 
    GtkWidget *window; 
    GError  *error = NULL; 
    gtk_init(&argc, &argv); 

    gtkBuilder = gtk_builder_new(); 
    if(!gtk_builder_add_from_file(gtkBuilder, "gui_config.glade", &error)) 
    { 
     g_warning("%s", error->message); 
     g_free(error); 
     return(1); 
    } 
    window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "crc_main")); 

    /* Connect signals */ 
    gtk_builder_connect_signals(gtkBuilder, NULL); 

    /* Destroy builder, since we don't need it anymore */ 
    g_object_unref(G_OBJECT(gtkBuilder)); 

    gtk_widget_show(window); 
    gtk_main(); 

    return 0; 
} 

MinGW versagt GTK-Bibliotheken mit meinem GUI-Code zu verknüpfen, ist hier der Fehler erhalte ich:

-- The C compiler identification is GNU 6.3.0 
-- Check for working C compiler: C:/MinGW/bin/gcc.exe 
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works 
-- Detecting C compiler ABI info 
-- Detecting C compiler ABI info - done 
-- Detecting C compile features 
-- Detecting C compile features - done 
-- Found PkgConfig: C:/gtk3/bin/pkg-config.exe (found version "0.28") 
-- Checking for module 'gtk+-3.0' 
-- Found gtk+-3.0, version 3.6.4 
-- Flags: -IC:/gtk3/include/gtk-3.0;C:/gtk3/include/cairo;C:/gtk3/include/pango- 
1.0;C:/gtk3/include/atk-1.0;C:/gtk3/include/cairo;C:/gtk3/include/pixman-1;C:/gt 
k3/include;C:/gtk3/include/freetype2;C:/gtk3/include;C:/gtk3/include/libpng15;C: 
/gtk3/include/gdk-pixbuf-2.0;C:/gtk3/include/libpng15;C:/gtk3/include/glib-2.0;C 
:/gtk3/lib/glib-2.0/include 
-- Configuring done 
-- Generating done 
-- Build files have been written to: E:/crc_update/trunk/GUI/Builds 
-- Flags: -IC:/gtk3/include/gtk-3.0;C:/gtk3/include/cairo;C:/gtk3/include/pango- 
1.0;C:/gtk3/include/atk-1.0;C:/gtk3/include/cairo;C:/gtk3/include/pixman-1;C:/gt 
k3/include;C:/gtk3/include/freetype2;C:/gtk3/include;C:/gtk3/include/libpng15;C: 
/gtk3/include/gdk-pixbuf-2.0;C:/gtk3/include/libpng15;C:/gtk3/include/glib-2.0;C 
:/gtk3/lib/glib-2.0/include 
-- Configuring done 
-- Generating done 
-- Build files have been written to: E:/crc_update/trunk/GUI/Builds 
Scanning dependencies of target main 
[ 50%] Building C object CMakeFiles/main.dir/example.c.obj 
[100%] Linking C executable ..\bin\main.exe 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x3e): undefined r 
eference to `gtk_init_abi_check' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x43): undefined r 
eference to `gtk_builder_new' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x63): undefined r 
eference to `gtk_builder_add_from_file' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x8e): undefined r 
eference to `g_log' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x9a): undefined r 
eference to `g_free' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0xa6): undefined r 
eference to `gtk_widget_get_type' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0xbe): undefined r 
eference to `gtk_builder_get_object' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0xce): undefined r 
eference to `g_type_check_instance_cast' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0xe6): undefined r 
eference to `gtk_builder_connect_signals' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x102): undefined 
reference to `g_type_check_instance_cast' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x10a): undefined 
reference to `g_object_unref' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x116): undefined 
reference to `gtk_widget_show' 
CMakeFiles\main.dir/objects.a(example.c.obj):example.c:(.text+0x11b): undefined 
reference to `gtk_main' 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\main.dir\build.make:95: recipe for target '../bin/main.exe' failed 
mingw32-make[2]: *** [../bin/main.exe] Error 1 
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/main.dir/all' failed 
mingw32-make[1]: *** [CMakeFiles/main.dir/all] Error 2 
Makefile:82: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

kann mir mit diesem Problem helfen?

+0

Sie überprüfen * compile flags *, aber der Grund für "undefined reference" ist die Abwesenheit der richtigen ** Bibliothek zu verknüpfen **, nicht ein Kompilieren Flags. BTW, zum Setzen von Include-Verzeichnissen gibt es den CMake-Befehl 'include_directories'; es ist nicht notwendig, sie in 'CMAKE_C_FLAGS' zu konvertieren (was falsch gemacht wird, da die Option '-I' nur an das erste Verzeichnis angehängt wurde). Setzen Sie auch niemals 'CMAKE_SOURCE_DIR' - dies ist eine automatische CMake-Variable, die immer auf den Stamm des Projekts zeigen soll. – Tsyvarev

+0

Ich habe include_directories der GTK-Bibliotheken verwendet, aber es gibt das gleiche Ergebnis. Haben Sie noch andere Gedanken, warum die Bibliotheksverknüpfung fehlschlägt? –

+0

Sie können den Inhalt der Variablen 'LIBRARIES' überprüfen, die Sie verwenden. – Tsyvarev

Antwort

0

Ihre CMakelists sieht komisch aus, als ob Sie alles von Hand machen wollen. Schauen Sie sich das alte CMakeLists.txt: https://stackoverflow.com/a/5105523/518853

Es ist für GTK 2 aber leicht angepasst, wenn Sie die 2 durch 3 ersetzen.

By the way, ist das GTK-Projekt von Autotool zum Meson Build-System langsam migrieren, so wan Sie vielleicht einen Blick auf, wie eine Meson-Build-Datei für eine GTK app aussieht geben:

project('tutorial', 'c') 
gtkdep = dependency('gtk+-3.0') 
executable('demo', 'main.c', dependencies : gtkdep) 

Quelle: http://mesonbuild.com/Tutorial.html

+0

Es ist nicht für mich arbeiten . Noch habe ich die Linker-Fehler, dass die Mingw die Bibliotheken nicht finden kann, mit denen zu verknüpfen ist. –

+0

In Ihren Protokollen sehe ich, dass Ihr GTK in 'C:/gtk' installiert ist, und es ist 3.6.4, das wirklich alt ist. Warum benutzen Sie nicht einfach MSYS2, um Ihre MinGW-Umgebung einzurichten und die GTK-Bibliothek mit MSYS2 'pacman'-Tool zu installieren, wie es auf der GTK-Website deutlich heißt? Wenn Sie keinen guten Grund haben, einen alten GTK zu verwenden, sollten Sie so vorgehen. Verwenden Sie den Paketmanager 'pacman', um auch CMake zu installieren. – liberforce

Verwandte Themen