情況說明
先前已經在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?