GTK+开发环境搭建

2023-05-16

一般讲到GUI程序开发,大家都会想到C++等面向对象的高级语言,而认为C语言不能做界面。C语言也可以用来写界面,GTK+就是一个用来写界面的库,它本身就是用C语言写的,而且实现了面向对象的设计。对于一个C语言程序员来说,通常都不是专业做UI开发的,但是偶尔还是需要写个带界面的小程序,去学习其他编程语言太麻烦了,所以学习基于C语言的GTK+是一个不错的选择。

本文主要讲解怎么在windows系统下搭建GTK+开发环境,Linux下就不讲了,因为GTK+本来就是Linux下的东西,GNOME就是基于GTK的,各种依赖组件都有了,所以应该比windows下简单很多,一般都是apt-get一条命令搞定。

这里不考虑VS平台,只考虑在msys2的开发环境,在msys2需要下一个编译器,msys2下搭建gcc开发环境可以参考以下这篇文章

https://blog.csdn.net/qiuzhiqian1990/article/details/56671839

有3种方法可以搭建gtk开发环境,分别是用pacman命令安装,下载all-in-one bundle包安装和从源码安装。

#1.使用pacman安装
这也是目前官方推荐的方法,先使用以下命令查看GTK的版本

pacman -Ss gtk

然后会列出很多版本的名字,找一个版本安装,
mingw32/mingw-w64-i686-gtk3 3.22.30-1 [已安装]
GObject-based multi-platform GUI toolkit (v3) (mingw-w64)
我装的是3.22版本,如果编译器是64位需要把i686-换成x86_64,安装命令如下,不要把3.22.30-1输进去,这只是一个说明

pacman -S mingw32/mingw-w64-i686-gtk3

安装完了之后在F:\msys32\mingw32\bin下有很多gtk的例子程序,都是以gtk开头,比如下面这个gtk3-demo.exe软件就是GTK+写的,它展示了一些例子,有源代码,还可以点run运行
这里写图片描述

接下来就写一个最简单的程序运行一下吧

#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");
    gtk_widget_show(window);

    gtk_main();
    return 0;
}

当然编译肯定是找不到头文件,由于gtk的依赖非常多,要添加很多路径,刚开始傻傻的一个个添加,其实有一种很简单的方法,进入F:\msys32\mingw32目录,输入命令pkg-config,没有这个命令第3节会说明怎么解决

pkg-config --cflags gtk+-3.0

此时就会生成所有头文件路径,直接加到eclipse的编译选项里,就不用一个个添加了

-mms-bitfields -pthread -mms-bitfields -IF:/msys32/mingw32/include/gtk-3.0 -IF:/msys32/mingw32/include/cairo -IF:/msys32/mingw32/include -IF:/msys32/mingw32/include/pango-1.0 -IF:/msys32/mingw32/include/fribidi -IF:/msys32/mingw32/include/atk-1.0 -IF:/msys32/mingw32/include/cairo -IF:/msys32/mingw32/include/pixman-1 -IF:/msys32/mingw32/include -IF:/msys32/mingw32/include/freetype2 -IF:/msys32/mingw32/include -IF:/msys32/mingw32/include/harfbuzz -IF:/msys32/mingw32/include/libpng16 -IF:/msys32/mingw32/include/gdk-pixbuf-2.0 -IF:/msys32/mingw32/include/libpng16 -IF:/msys32/mingw32/include -IF:/msys32/mingw32/include/glib-2.0 -IF:/msys32/mingw32/lib/glib-2.0/include -IF:/msys32/mingw32/include

如下图所示,把上面这一大串复制到other flags里,就是告诉gcc在这些头文件路径路查找。

这里写图片描述

此时头文件有了,但是编译时又报出各种找不到符号,这是因为没有把依赖库加入到工程里,同理我们需要查看gtk需要哪些库,使用命令

pkg-config --libs gtk+-3.0

此时生成生成了需要的库

-LF:/msys32/mingw32/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lfribidi -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl

很可惜不能直接复制,因为mingw32/lib文件夹下的库不能用,而mingw32/bin下的库可以用,但是库的名字又有点差别,所以需要手工修改

-LF:/msys32/mingw32/bin -LF:/msys32/mingw32/lib -lgtk-3-0 -lgdk-3-0 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lz -lpangowin32-1.0-0 -lpangocairo-1.0-0 -lpango-1.0-0 -lfribidi-0 -latk-1.0-0 -lcairo-gobject-2 -lcairo-2 -lgdk_pixbuf-2.0-0 -lgio-2.0-0 -lgobject-2.0-0 -lglib-2.0-0 -lintl-8

然后把修改的内容加入到链接器选项里面:
这里写图片描述

这下终于可以编译成功了,但是运行时又提示缺少动态库,上面加的库是编译用的,运行时还需要很多很多库,所以要添加环境变量,在path这一项里加入F:\msys32\mingw32\bin;让电脑知道动态库都在哪里,但是发现加到结尾还是不行,查了一下,别人说要加到path的开头,试了一下果然可以,真是神奇,运行结果如下
这里写图片描述
最后我们发现还有个黑框框,如果想要去掉,在前面的设置里,需要在链接器选项里再添加-mwindows
这里写图片描述

#2.使用all-in-one bundle安装

all-in-one bundle就是把所有编译好的依赖放到一个压缩包里,下载地址为:

http://win32builder.gnome.org/

找到gtk±bundle_3.4.2-20130921_win32.zip的包下载,这里的32位或64位与电脑操作系统无关,只与编译器版本有关。下载完毕后解压的一个文件夹下,我的是放在F:\gtk。

和上面类似的使用cmd进入F:\gtk\bin文件夹,使用pkg-config命令查看头文件路径和所需的库,然后也和前面一样需要手工修改生成的链接库选项。

操作步骤和前面基本一样,用这种方式可以不在msys2平台下。

#3.从源码编译安装

这种方式在msys2下没有成功,但也记录下吧。

我下载的是gtk±3.20.0源码,解压后进入源码文件夹,然后运行./configure命令,提示说缺少pkg-config,然后使用 pacman 安装pkg-config,但是安装完毕后发现还是同样的错误,在shell里输入pkg-config发现没有该命令,所以可以确定pkg-config安装的地方没有设置环境变量。大部分软件都会安装在F:\msys32\usr\binn里,而pkg-config却安装在F:\msys32\mingw32\bin,所以需要在环境变量添加改路径,即在F:\msys32\etc\skel\.bashrc文件里加入这一句

export PATH=/f/msys32/mingw32/bin:$PATH

使用时再导入skel.bashrc即可
source /etc/skel/.bashrc

这时候shell就能识别所有在mingw32/bin文件夹里的命令了,然后又报缺少依赖包,
configure: error: Package requirements (glib-2.0 >= 2.45.8 atk >= 2.15.1 pango >= 1.37.3 cairo >= 1.14.0 cairo-gobject >= 1.14.0 gdk-pixbuf-2.0 >= 2.30.0) were not met:
No package ‘atk’ found
No package ‘pango’ found
No package ‘cairo’ found
No package ‘cairo-gobject’ found
No package ‘gdk-pixbuf-2.0’ found

再把上面的包都安装,最后还是出现了一个错误

configure: error: Package requirements ( cairo-xlib) were not met:
No package ‘cairo-xlib’ found

cairo-xlib这个包目前不知道在哪里,有人说要先安装libcairo2-dev,这个包在linux下有,在windows下也找不到,最后可能只有编译cairo源码了,我没试过。

要使用编译源码的方式安装,还是在linux下比较好,不管什么包都很好找,要安装libcairo2-dev只需一条命令就搞定了

sudo apt-get install libcairo2-dev

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GTK+开发环境搭建 的相关文章

  • Ubuntu18.04创建工作空间和功能包

    由于本人记性实在不好 xff0c 每次新建工作空间和功能包的时候都要重新百度 xff0c 因此就以这种方式记下来 xff0c 有错误的地方还请批评指正 1 创建工作空间catkin ws mkdir p catkin ws src 2 初始
  • 关于安装双系统Linux不能完整分区解决方法

    在我安装双系统win7 43 ubuntu 16 x x版本时 xff0c ubuntu 在安装过程中会检测到win7 系统磁盘使用情况 将ubuntu 安装在空闲硬盘位置时 xff0c 系统设置不能有4 个主分区 xff0c 所以在分区过
  • 彻底删除VM虚拟机手把手详细教学

    一 在彻底删除VMware之前我们应在服务中把VM的任务和进程全部中止 1 我们首先按windows键 输入 服务 我们打开服务 2 在服务中我们找到vm开头的服务 并右键停止这些服务 3 按ctrl 43 alt 43 del选择任务管理
  • Leetcode 常用函数总结(C语言版本)

    include lt stdio h gt include lt stdbool h gt include lt math h gt include lt ctype h gt include lt string h gt include
  • C++ map表的应用

    map表可以存储数据对应关系 include lt map gt include lt string gt include lt iostream gt using namespace std int main map lt int str
  • C++判断是否是IP地址

    判断是否是IP地址 bool isIPAddress const char s const char pChar bool rv 61 true int tmp1 tmp2 tmp3 tmp4 i while 1 i 61 sscanf s
  • ARDUSUB 浏览

    ArduSub is an advanced open source ROV AUV control system Overview ArduSub水下机器人的控制器是一个完整的开源解决方案 提供远程操作控制 通过智能潜水模式 和全自动的执
  • C++判断是否是纯数字

    C 43 43 判断是否是纯数字 bool isDigitStr const char cstr if NULL 61 61 cstr cstr 0 61 61 0 return false int len 61 strlen cstr i
  • 命里有时终须有,命里无时莫强求

    命里有时终须有 xff0c 命里无时莫强求 今天是2012年2月24号 xff0c 和我谈了3个多月的女生突然之间说我们之间不合适 xff0c 让我以后不要再去骚扰她 真心第一次体会到失恋的感觉 xff0c 同时打电话给我姐姐诉说了下 xf
  • 共享内存--函数

    共享内存允许两个不相关的进程访问同一个逻辑内存 共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式 大多数的共享内存的具体实现 xff0c 都把由不同进程之间共享的内存安排为同一段物理内存 共享内存是由IPC为进程创建的一个特殊
  • assert用法

    判断是否为真 include 34 stdio h 34 include lt string h gt include lt stdlib h gt define NDEBUG include lt assert h gt void mai
  • strcpy原型

    已知strcpy 函数的原型是 char strcpy char strDest const char strSrc 其中strDest 是目的字符串 xff0c strSrc 是源字符串 xff08 1 xff09 不调用C 43 43
  • new与delete正确用法

    说明 xff1a 推荐使用如下宏 xff0c 可以在一定程度上避免使用空指针 xff0c 野指针的问题 define HW NEW var classname do try var 61 new classname catch var 61
  • Ubuntu分区和文件系统选择

    转载 xff0c 记录下 xff1a Ubuntu 分区和文件系统的选择 smwikipedia 博客园 对新手来说转移到 Ubuntu 第一件头痛的事情就是分区 xff0c 因为它和 Windows 上的分区方式有很大的不同 xff0c
  • [JavaScript]通过JS使用MD5加密

    JavaScript 通过JS使用MD5加密 目录 JavaScript 通过JS使用MD5加密项目信息如何使用额外信息 项目信息 github地址 https github com blueimp JavaScript MD5 作者dem
  • ThinkPad 插电时电源指示灯不亮

    今天来公司准备开电脑 xff08 ThinkPad T480 xff09 xff0c 开不开 电源键按了灯不亮 以为是插座没电 xff0c 但是发现手机充电器能给手机充上电 以为是电源适配器坏了 xff0c 因为是type c口的 xff0
  • [MongoDB] 启动报错ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=14)

    原因是文件读取权限不足 xff0c 执行以下操作 span class token function sudo span span class token function chown span R mongod mongod var li
  • [Linux] Ubuntu如何查看磁盘剩余空间及内存

    如果有多台服务器 xff0c 这时需要安装一些新应用 xff0c 那么装在哪台设备上更合适呢 xff1f 这是我的第一个想法是看一看这些服务器的剩余空间和剩余内存 那么怎么才能看硬盘空间及内存呢 xff1f 查看剩余内存 span clas
  • [Linux] docker-compose环境下mongoDB4.4.2副本集搭建

    文章目录 实验目标实验环境目录结构操作步骤模拟宕机补充20201220补充2020122019参考 实验目标 两台服务器 主要使用服务器A进行读写 xff0c 每天需要定时重启 服务器B只进行备份操作 xff0c 不需要每天重启 当服务器A
  • [Alpine] 安装Alpine虚拟机,并安装docker,docker-compose

    下载alpine镜像 https www alpinelinux org downloads 开机后执行 setup alpine 一路回车直到需要输入root新密码 xff0c 可以先设置123456 以后再改 选择时区 xff0c 可以

随机推荐

  • 需求和预研

    需求 一定是有确定时间 xff0c 有衡量指标的任务 xff0c 这样才能可控 xff0c 才有意义 否则的话 xff0c 一个版本由若干个需求 xff0c 最后都没完成 xff0c 因为在做之前是未知数 xff0c 这个版本是一个有问题的
  • 设计/编码时,异常场景要处理到什么程度?容错到什么地步?

    设计时要清晰责任边界 xff0c 哪些异常需要吞掉自己处理 xff0c 哪些就暴露出去让其他服务 手段处理 这样目标清晰 xff0c 分工明确 xff0c 能够提高效率 xff0c 降低维护成本 xff0c 甩锅有理有据
  • 如何保质保量的完成需求

    如何保证数量 一个版本中 控制住每个需求的时间 即可保证数量 如何保证时间 避免返工 对齐 需求 设计方案 测试方案 代码质量 有问题一次解决 不修改引入新问题 设置路标 Roadmap 路标有时间节点 以及标明会完成哪些可度量的工作 每个
  • [Java] Request processing failed; nested exception is org.apache.ibatis.binding.Bin

    Request processing failed nested exception is org apache ibatis binding Bin springMVC xff0b mybatis 遇到的问题 xff0c 在XXXmapp
  • [Linux] CentOS7安装Chrome后yum不可以使用的解决方法

    症状 xff1a http dl google com linux chrome rpm stable x86 64 repodata repomd xml Errno 14 curl 52 Empty reply from server
  • [Java] 报错 java.lang.IllegalArgumentException: host parameter is null

    因为URL中存在中文字符 xff0c 需要编码 如 http baidu com 文件1 String encodeUrl 61 java span class hljs preprocessor net span span class h
  • Ubuntu 录屏

    GNOME录屏软件 Ubuntu 附带的屏幕录像机 xff0c 当您点击 Ctrl 43 Shift 43 Alt 43 R 时触发 它会自动开始录制整个屏幕 当您再次点击同一热键时 xff0c 截屏将结束并保存 点击录制热键时 xff0c
  • 【Odroid-XU4开发板】【安装Ubuntu18.04】【安装ROS】并读取串口数据的踩坑日记

    Odroid XU4开发板安装Ubuntu18 04安装ROS并读取串口数据的踩坑日记 文章目录 Odroid XU4开发板安装Ubuntu18 04安装ROS并读取串口数据的踩坑日记前言一 系统镜像准备二 烧录软件准备3 装机4 安装ro
  • 消除VS中C6054:可能没有为字符串"XXX"添加字符串零终止符的警告

    常见的是用 strlen 函数统计字符串的长度的时候 下面经常出现波浪线 xff08 即报警告C6054 xff09 xff0c 如下图所示 xff1a 怎么解决去掉这个警告呢 xff1f 64 wowpH 在这之前需要了解一下 strle
  • docker pull下载的image存在什么地方去了

    结论 xff1a 所有放入镜像文件都放在虚拟硬盘文件里面 windows上安装的docker其实本质上还是借助与windows平台的hyper v技术来创建一个linux虚拟机 xff0c 你执行的所有命令其实都是在这个虚拟机里执行的 xf
  • Eclipse CDT初步使用教程

    我用过Source insight和VS xff0c 感觉不顺手就没用了 xff0c 所以也没有深入研究过 xff0c 其他的如Code Blocks xff0c vim xff0c Clion Emacs我也没用过 xff0c 不好做评价
  • eclispe设置断点无效(No source file named)

    最近不知道做了什么操作导致eclipse的断点无效 xff0c 表现为gdb只认相对路径的断点 xff0c 不认绝对路径 xff0c 而eclipse打断点使用的是绝对路径 xff0c 导致无效 xff0c 输出信息是 xff1a No s
  • lemon源码基本概念整理

    1 数据结构 1 1 字符串存储 定义一个x1a的全局变量 xff0c 存放 y文件经过词法分析器分割出来的字符串 span class token keyword struct span s x1 span class token pun
  • lemon源码分析

    基本概念见上篇 lemon源码基本概念整理 1 follow集 对于如下4条产生式 program 61 expr TK SEM expr 61 expr TK IMPL expr expr 61 TK LPAREN expr TK RPA
  • Tcl脚本初步学习

    1 命令 Tcl 是一门基于命令的脚本语言 xff0c 每个命令通过换行符或分好隔开 每条命令都包含一个或多个单词 xff0c 第一个单词是命令名 xff0c 其他单词是命令的参数 xff0c 如 xff1a 命令 命令名 参数 set a
  • SQLite3源码学习(31) WAL日志的锁机制

    1 锁的原理 先来回顾一下回滚日志的文件锁 xff0c 之前的锁是针对数据库文件加锁的 xff0c 有4种类型 xff0c 分别是shared reserverd pending和exclusive 在WAL日志模式下不再使用原来的锁 xf
  • QGC调试px4固件飞控

    文章目录 前言一 开源软件地址二 硬件接线三 无人机调试1 刷固件2 选机架3 校准传感器4 校准遥控器5 飞行模式设置6 电源设置7 查看电机8 试飞 总结 前言 开源无人机调试 xff1a 硬件 xff1a pixhawk 2 4 8
  • CMake 基本使用方法

    1 学习背景 C语言工程使用make来构建工程 xff0c 但是对于大型工程来说文件的依赖关系很复杂 xff0c 手写makefile非常麻烦 xff0c 一般开源代码的构建方式都是使用autotool来配置编译环境和自动生成makefil
  • 嵌入式操作系统学习(3)FreeRTOS的任务调度机制

    1 任务状态 FreeRTOS可以创建多个任务 xff0c 但是对于单核cpu来说 xff0c 在任意给定时间 xff0c 实际上只有一个任务被执行 xff0c 这样就可以把任务分成2个状态 xff0c 即运行状态和非运行状态 当任务处于运
  • GTK+开发环境搭建

    一般讲到GUI程序开发 xff0c 大家都会想到C 43 43 等面向对象的高级语言 xff0c 而认为C语言不能做界面 C语言也可以用来写界面 xff0c GTK 43 就是一个用来写界面的库 xff0c 它本身就是用C语言写的 xff0