情况说明

先前已经在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?

最新文章

  1. 使用DFA做文本编辑器的自动提示
  2. Linux添加用户(user)到用户组(group)
  3. mailto: HTML e-mail 链接
  4. 【转】在C#中使用SendMessage
  5. android手机两种方式获取IP地址
  6. Asp.net Request方法获取客户端的信息
  7. 【wikioi】1282 约瑟夫问题
  8. Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
  9. org.eclipse.wst.common.project.facet.core.xml文件模板,解决eclipse编译报错。
  10. poj1988
  11. BrnShop开源网上商城第三讲:插件的工作机制
  12. Java基础(十)内部类
  13. Docker实战--部署简单nodejs应用
  14. 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)
  15. python基础教程(二)
  16. .NET Core开发日志——GraphQL
  17. Confluence 6 整合到其他数据库
  18. 【Spark】SparkStreaming-Checkpoint-容错
  19. Dapper MySql DateTime 异常
  20. 架设FTP Server-Windows Server 2012

热门文章

  1. Thinkphp5 实现动态模板主题多个模板切换
  2. 锐捷交换机如何配置远程管理地址(telnet)
  3. MySQL 使用 ON UPDATE CURRENT_TIMESTAMP 自动更新 timestamp (转)
  4. 基于term vector深入探查数据
  5. springBoot项目不重新上传jar包,增量升级步骤
  6. Java之输入和输出
  7. POJ-图论-最短路模板(邻接矩阵)
  8. 使用Android SDK卸载厂家程序
  9. 「杂录」CSP-S 2019 爆炸记&amp;题解
  10. 有关dfs、bfs解决迷宫问题的个人见解