狀況說明
先前已經在windows下基於GDI實現了一個簡陋的imshow:基於GDI的imshow:使用stb_image讀取圖像並修正繪製。考慮跨平臺,也考慮萬一某天M$不讓咱們用盜版系統了,仍是須要實現一個Linux/Mac下的imshow。html
GTK至關於GDI在Linux下的一個替代。我用的是GTK-3c++
官方GTK文檔的tutorial給出了一個能運行的例子,不過構建工具用的很是raw的gcc和pkg-config,未免過於刀耕火種。用CMake改造一下也是能夠的。這裏簡單記錄。ubuntu
依賴項
ubuntu下的依賴項
- pkg-config
sudo apt install pkg-config
- gtk3
sudo apt-get install libgtk-3-dev
- cmake
手動下載解壓配置最新的cmake,例如3.14windows
mac OSX下的依賴項
mac下也可使用gtk-3.0。依賴問題解決以下:bash
brew install pkg-config gtk+3 libffi
而後還須要手動解決下libffi沒法被cmake找到的問題,第一種辦法是在~/.bashrc或~/.zshrc中添加:app
export PKG_CONFIG_PATH="(brew --prefix libffi)/lib/pkgconfig/"
不過這個辦法略顯ugly,另外一種ugly的作法是在CMake中臨時修改PKG_CONFIG_PATH環境變量。考慮到gtk庫自己的連接目錄在Mac OSX下也不能被cmake找到,仍是須要另行寫一段cmake的,所以不如都放到cmake腳本中處理。ide
目錄結構
CMakeLists.txt src/main.c build/
代碼工具
CMakeLists.txt
ui
試了下直接find_package(GTK)
不行。須要搭配pkg-config,cmake已經對此作出封裝。spa
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?