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

发布于 2024-08-30 19:06:05 字数 678 浏览 8 评论 0原文

我现在通过手动包含所有必需的路径(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)

I'm now doing it in a very ugly way by manually including all the required path(the gtk bundle is at 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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝礼 2024-09-06 19:06:05

2019-10-29 编辑:虽然这个答案仍然有效,但请注意,自 2011 年我最初的答案以来,CMake 已经发展了很多。对“现代 CMake”进行一些搜索,因为有许多语法和最佳实践更改.

原始答案:

只需将包含 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 之外工作。

2019-10-29 EDIT: While this answer could still work, please note that CMake has evolved a lot since my original answer in 2011. Do some search on "modern CMake" as there have been many syntactic and best practices changes.

Original Answer:

Just add the directory that contains pkg-config (which is in your gtk-bundle/bin directory) to your PATH. That way, CMake will find it.

Here's a CMakeLists.txt for a sample application written in GTK2:

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

And the main.c file for my test app:

#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;
}

I tested it on Win XP with CMake 2.4 and CMake 2.8 and MinGW, and it works. It should also work outside MinGW.

森林迷了鹿 2024-09-06 19:06:05

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

根据 CMake 邮件列表上的这篇文章,您应该:

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 版本的一部分,您可以尝试从 这里

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

if(UNIX)
  ...
endif(UNIX)

Update3:再次引用来自邮件列表:

...
这种传播到 Windows 的一个典型例子是 libGTK+ 和它的朋友(作为一个
其他已在此线程中提到)。一些 PLplot 驱动程序依赖于
GTK+ 库堆栈的一部分。我引用我们一位开发人员的话
(Werner Smekal)最近向 PLplot 开发列表报告了如何
让这些驱动程序在 Windows 上运行很简单:

<块引用>

Windows 中的 Cairo 驱动程序或在 Windows 上使用 gtk+ 进行 plplot

1) 下载 GTK+ 堆栈的一体化捆绑包,包括 Windows 的第 3 方依赖项:
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:\Development\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 标头不存在。

所以看来你错过了:

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

My CMake knowledge is somewhat dated, and I try to distance myself from Windows because I find it unpleasant, but this is what FindGTK.cmake should be for.

According to this post on the CMake mailing list you should:

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)

Update: It might be that the FindGTK.cmake is indeed too old and refers to GTK1, you might want to try FindGTK2.cmake instead. If it isn't part of your CMake version you can try and get it from here.

Update2: Indeed the the FindGTK2 link above is no good for you. All it's logic is enclosed with:

if(UNIX)
  ...
endif(UNIX)

Update3: Again a quote from the mailing list:

...
One prime example of such spread to windows is libGTK+ and friends (as one
other has mentioned in this thread). Some of the PLplot drivers depend on
parts of the GTK+ stack of libraries. I quote from one of our developers
(Werner Smekal) who recently reported to the PLplot devel list about how
simple it is to get those drivers to work on windows:

Cairo driver in Windows or using gtk+ for plplot on Windows

1) Download the all-in-one bundle of the GTK+ stack including 3rd-party dependencies for windows:
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.12/gtk+-bundle-2.12.9.zip
available from http://www.gtk.org/download-windows.html.

2) Expand the package to a directory, e.g. C:\Development\gtk

3) Set environment variables so that CMake can find pkf-config

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

4) CMake will find pkg-config and all the libraries necessary to build the
pdfcairo, pscairo, pngcairo and svgcairo devices. xcairo will not be built
since the X-Headers are not present.

So it seem you are missing the:

set PKG_CONFIG_PATH=C:\path\to\gtk\lib\pkgconfig
set PATH=C:\path\to\gtk\bin;%PATH%
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文