用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?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM