2017-09-09 20 views
0

私はWindows 8.1 OSを使っています。 MinGWとgtkの両方のパスがパス環境変数に追加されます。現在私はgtkライブラリと私のコードをリンクするのに問題があります。ここcmakeとMinGW gccコンパイラを使ってgtk guiをビルドできません

はここ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}) 

は、私が構築するために使用するパッチファイルです。

@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 .. 

ここに私が作成しようとしているGUIコードがあります。

#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のは、ここで、私のGUIコードでGTKライブラリをリンクに失敗し、エラーが私が取得さ:

-- 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 

は、いずれかがこの問題で私を助けることができますか?

+0

*コンパイルフラグ*をチェックしていますが、 "未定義参照"の理由は、**リンクするための適切な**ライブラリがなく、コンパイルフラグではありません。ところで、インクルードディレクトリを設定するには、CMakeコマンド 'include_directories'があります。 'CMAKE_C_FLAGS'に変換する必要はありません(' -I'オプションが最初のディレクトリにのみ追加されているので、間違っています)。また、 'CMAKE_SOURCE_DIR'を設定しないでください。これは自動CMake変数です。常にプロジェクトのルートを指しているはずです。 – Tsyvarev

+0

私はgtkライブラリのinclude_directoriesを使用しましたが、同じ結果が得られます。図書館のリンクが失敗している理由は他にもありますか? –

+0

あなたが使用する 'LIBRARIES'変数の内容をチェックすることができます。 – Tsyvarev

答えて

0

あなたのCMakelistsは奇妙に見えますが、あなたは手ですべてをやろうとしているようです。この古いCMakeLists.txtで ルック:https://stackoverflow.com/a/5105523/518853

それはGTK 2のためだが、あなたは32を交換する場合は、容易に適応することができます。ところで

、GTKプロジェクトはゆっくりとautotoolsのから中間子のビルドシステムに移行されるので、あなたはGTKアプリのための中間子のビルドファイルがどのように見えるかを見て与えること弱々しいことがあります。

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

をソース:http://mesonbuild.com/Tutorial.html

+0

それは私のために働いていません。それでもMingwがリンクするライブラリを見つけることができないというリンカのエラーがあります。 –

+0

あなたのログにはGTKが 'C:/ gtk'にインストールされているのが見えます。本当に古い3.6.4です。 GTKのウェブサイトに明記されているように、MSYS2を使用してMinGW環境をセットアップし、MSYS2の 'pacman'ツールを使用してGTKライブラリをインストールしてみませんか?あなたが古いGTKを使う良い理由がない限り、それはあなたが行かなければならない方法です。 'pacman'パッケージマネージャを使ってCMakeをインストールしてください。 – liberforce

関連する問題