如何在Windows中使用cmake更轻松地链接gtk库?

时间:2010-04-28 14:02:49

标签: windows gtk cmake gtk2

我现在通过手动包含所有必需的路径(gtk包位于D:/Tools/gtk+-bundle_2.20.0-20100406_win32)以非常丑陋的方式执行此操作:

include_directories(D:/Tools/gtk+-bundle_2.20.0-20100406_win32/include/gtk-2.0 D:/Tools/gtk+-bundle_2.20.0-20100406_win32/include/glib-2.0 D:/Tools/gtk+-bundle_2.20.0-20100406_win32/lib/glib-2.0/include D:/Tools/gtk+-bundle_2.20.0-20100406_win32/include/cairo D:/Tools/gtk+-bundle_2.20.0-20100406_win32/include/pango-1.0 D:/Tools/gtk+-bundle_2.20.0-20100406_win32/lib/gtk-2.0/include D:/Tools/gtk+-bundle_2.20.0-20100406_win32/include/atk-1.0)
link_directories(D:/Tools/gtk+-bundle_2.20.0-20100406_win32/lib)

target_link_libraries(MyProgram gtk-win32-2.0.lib)

2 个答案:

答案 0 :(得分:8)

只需将包含pkg-config(位于gtk-bundle / bin目录中)的目录添加到PATH即可。这样,CMake就会找到它。

这是一个用GTK2编写的示例应用程序的CMakeLists.txt:

cmake_minimum_required (VERSION 2.4)
project (gtk-test)

find_package (PkgConfig REQUIRED)
pkg_check_modules (GTK2 REQUIRED gtk+-2.0)

include_directories (${GTK2_INCLUDE_DIRS})
link_directories (${GTK2_LIBRARY_DIRS})
add_executable (gtk-test main.c)
add_definitions (${GTK2_CFLAGS_OTHER})
target_link_libraries (gtk-test ${GTK2_LIBRARIES})

我的测试应用的main.c文件:

#include <gtk/gtk.h>

int main (int argc, char **argv)
{
    GtkWidget *window;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Hello world !");
    g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);

    gtk_widget_show_all (window);
    gtk_main ();

    return 0;
}

我在Win XP上使用CMake 2.4和CMake 2.8和MinGW进行了测试,它可以正常工作。它也应该在MinGW之外工作。

答案 1 :(得分:0)

我的CMake知识有些过时,我试图将自己与Windows保持距离,因为我觉得它很不愉快,但这就是FindGTK.cmake应该用的。

根据CMake邮件列表上的this post,你应该:

FIND_PACKAGE(GTK)

IF(GTK_FOUND)
   INCLUDE_DIRECTORIES(${GTK_INCLUDE_DIR})
   ADD_EXECUTABLE(my_gtk_exe my_gtk_exe.cxx)
   TARGET_LINK_LIBRARIES(my_gtk_exe ${GTK_LIBRARIES})
ENDIF(GTK_FOUND)

更新:可能FindGTK.cmake确实太旧而且引用了GTK1,您可能想尝试FindGTK2.cmake。如果它不是您的CMake版本的一部分,您可以尝试从here获取它。

Update2 :的确,上面的FindGTK2链接对您没有好处。所有它的逻辑都包含在:

if(UNIX)
  ...
endif(UNIX)

Update3 :再次从邮件列表中quote

  

...   这种传播到Windows的一个主要例子是libGTK +和朋友(作为一个   其他人在这个帖子中提到过)。一些PLplot驱动程序依赖于   GTK +库的一部分。我引用了我们的一位开发人员的话   (Werner Smekal)最近向PLplot devel列表报道了如何做到   简单的是让这些驱动程序在Windows上工作:

     
    

Windows中的Cairo驱动程序或Windows上使用gtk + for plplot

         

1)下载GTK +堆栈的一体化捆绑包,包括Windows的第三方依赖项:     http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.12/gtk+-bundle-2.12.9.zip     可从http://www.gtk.org/download-windows.html获得。

         

2)将包扩展到目录,例如C:\发展\ GTK

         

3)设置环境变量,以便CMake可以找到pkf-config

  
    set PKG_CONFIG_PATH=C:\Development\gtk\lib\pkgconfig
    set PATH=C:\Development\gtk\bin;%PATH%
  
    

4)CMake将找到pkg-config和构建它所需的所有库     pdfcairo,pscairo,pngcairo和svgcairo设备。 xcairo将不会建成     因为X-Headers不存在。

  

所以看起来你错过了:

set PKG_CONFIG_PATH=C:\path\to\gtk\lib\pkgconfig
set PATH=C:\path\to\gtk\bin;%PATH%