用cmake构建gtk程序

摘要:
我使用GTK-3官方GTK文档的教程给出了一个可以运行的示例,但构建工具使用了非常原始的gcc和pkg-config,这太简单了。也可以使用CMake对其进行转换。依赖项ubuntu下的依赖项pkg-configsudoaptinstallpkg-configsgtk3sudoapt-getinstalllibgtk-3-devcmake手动下载并解压缩最新的cmake。例如,gtk-3.0也可以在3.14mac OSX下的dependency mac下使用。考虑到gtk库本身的链接目录在Mac OS X下无法被cmake找到,仍然需要编写另一个cmake,因此最好将其全部放在cmake脚本中。目录结构CMakeLists.txt src/main。build/code CMakeLists.txt尝试直接查找_包不好。它需要与cmake封装的pkg配置相结合。

情况说明

先前已经在windows下基于GDI实现了一个简陋的imshow:基于GDI的imshow:使用stb_image读取图像并修正绘制。考虑跨平台,也考虑万一某天M$不让我们用盗版系统了,还是需要实现一个Linux/Mac下的imshow。

GTK相当于GDI在Linux下的一个替代。我用的是GTK-3

官方GTK文档的tutorial给出了一个能运行的例子,不过构建工具用的非常raw的gcc和pkg-config,未免过于刀耕火种。用CMake改造一下也是可以的。这里简单记录。

依赖项

ubuntu下的依赖项

  • pkg-config
sudo apt install pkg-config
  • gtk3
sudo apt-get install libgtk-3-dev 
  • cmake

手动下载解压配置最新的cmake,例如3.14

mac OSX下的依赖项

mac下也可以使用gtk-3.0。依赖问题解决如下:

brew install pkg-config gtk+3 libffi

然后还需要手动解决下libffi无法被cmake找到的问题,第一种办法是在~/.bashrc或~/.zshrc中添加:

export PKG_CONFIG_PATH="(brew --prefix libffi)/lib/pkgconfig/"

不过这个办法略显ugly,另一种ugly的做法是在CMake中临时修改PKG_CONFIG_PATH环境变量。考虑到gtk库本身的链接目录在Mac OSX下也不能被cmake找到,还是需要另行写一段cmake的,因此不如都放到cmake脚本中处理。

目录结构

CMakeLists.txt

src/main.c

build/

代码

CMakeLists.txt

试了下直接find_package(GTK)不行。需要搭配pkg-config,cmake已经对此做出封装。

cmake_minimum_required (VERSION 3.14)
project (hello-gtk)

if (CMAKE_SYSTEM_NAME MATCHES "Linux")
    find_package(PkgConfig REQUIRED)
	pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
    message(STATUS "----- GTK3_INCLUDE_DIRS: ${GTK3_INCLUDE_DIRS}")
    message(STATUS "----- GKT3_LIBRARIES: ${GTK3_LIBRARIES}")
    message(STATUS "----- GTK3_LINK_LIBRARIES: ${GTK3_LINK_LIBRARIES}")
	include_directories(${GTK3_INCLUDE_DIRS})
	link_directories(${GTK3_LIBRARY_DIRS})
	list(APPEND FC_DEP_LIBS ${GTK3_LIBRARIES})
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
    #export PKG_CONFIG_PATH="$(brew --prefix libffi)/lib/pkgconfig/"
    set(ENV{PKG_CONFIG_PATH} /usr/local/opt/libffi/lib/pkgconfig)
    find_package(PkgConfig REQUIRED)
	pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
    message(STATUS "----- GKT3_LIBRARIES: ${GTK3_LIBRARIES}")
    message(STATUS "----- GTK3_LINK_LIBRARIES: ${GTK3_LINK_LIBRARIES}")
	include_directories(${GTK3_INCLUDE_DIRS})
    list(APPEND FC_DEP_LIBS ${GTK3_LINK_LIBRARIES})
endif()

add_executable (gtk-test src/main.c)

#add_definitions (${GTK3_CFLAGS_OTHER})
message(STATUS "----- ${GTK3_CFLAGS_OTHER}")
# -pthread

target_link_libraries (gtk-test ${FC_DEP_LIBS})

main.c

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer user_data)
{
    GtkWidget *window;

    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Window");
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    gtk_widget_show_all (window);
}

int main(int argc, char** argv)
{
    GtkApplication *app;
    int status;

    app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);

    return status;
}

Linux下cmake ..执行结果:

-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
-- Checking for module 'gtk+-3.0'
--   Found gtk+-3.0, version 3.18.9
-- ----- -pthread
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chris/dev/libfc/gtk/build

make之后运行得到窗口:

用cmake构建gtk程序第1张

reference
How do I link gtk library more easily with cmake in windows?

免责声明:文章转载自《用cmake构建gtk程序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇字符序列pascal程序使用PHPExcel解析Excel表格下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windos Linux(CentOS 7) opencv安装 tar.gz文件安装

前提: 版本为4.4.0 下载地址:https://github.com/opencv/opencv/releases windows 下载.exe 安装之后 复制2个文件: buildjavaopencv-440.jar, buildjavax64opencv_java440.dll 调用列子如下: //windows 版本...

ROS知识(3)----功能包package编译的两种方式

ROS的包编译有两种方法(我知道的),一种是用rosmake,这种方法简单;另一种是用catkin_make,这种方法更方便包的管理和开发。这两种方法都是先建立工作空间workspace(类似于vs下的解决方案,用来管理很多的项目),然后建立包package(类似于vs下的项目),最后利用rosmake或者catkin_make进行编译和运行。学会第一种方...

glib

一、glib介绍 libc指C函数库,这是一个通称,而glibc是GNU实现的libc,至于glib是一组较高层的函数库,比如链表、Hash等,在linux中glib是建立在glibc之上的,qt的库就叫做qt,也是建立在glibc和其他一些基本库之上。 GLib是Gtk +库和Gnome的基础。GLib可以在多个平台下使用,比如Linux、Unix、Wi...

ubuntu 14.04 源码编译mysql-5.7.17

环境为 Ubuntu 12.04 64 位的桌面版 编译的mysql 版本为 5.7.18 首先需要安装一下依赖包 sudo apt-get install libncurses5-dev cmake chkconfig 创建用户组和用户 mysql groupadd mysql useradd -r -g mysql -s /bin/bash mysq...

配置glibc

cmake_minimum_required(VERSION 3.10)project(yolo_example)set(CMAKE_CXX_STANDARD 11)include(FindPkgConfig)pkg_check_modules(GLIB glib-2.0 REQUIRED)include_directories(${GLIB_INCLUD...

C语言基于GTK+Libvlc实现的简易视频播放器(二)

简易视频播放器-全屏播放 一、课程说明上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这些功能也还是不够的,至少我们还应该有全屏播放的功能吧,所以这一次我们就来为上一次的视频播放器添加 上全屏播放功能。这个功能实现起来思路很简单,只是具体实现过程...