用cmake构建gtk程序
情况说明
先前已经在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之后运行得到窗口:
reference
How do I link gtk library more easily with cmake in windows?
Greatness is never a given, it must be earned.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2013-06-01 自己动手写一个霍夫变换检测直线(线段)