CMake構建學習筆記6-giflib庫的構建

charlee44發表於2024-08-25

前面構建的zlib、libpng、libjpeg和libtiff都提供了CMakeList.txt檔案,因此都可以透過CMake進行構建。不過有的依賴庫是並沒有CMakeList.txt檔案,也就是官方沒有提供CMake的構建方式,例如本篇要說的GIFLIB。GIFLIB是一個開源的C庫,用於處理GIF(圖形交換格式)影像檔案。

GIFLIB是個典型的基於Linux環境的開源庫,使用Makefile組織專案配置檔案,在Linux環境中透過make工具進行構建。那麼在Windows下如何進行構建呢?其中一個方案是安裝MSYS2(Minimal SYStem 2),它是一個基於Windows的類Unix shell環境,能夠提供一個包括make工具的跨平臺GNU工具鏈,被稱為MinGW(Minimalist GNU for Windows)。不過這種方案很麻煩,最關鍵的是Windows下MinGW編譯的庫和MSVC編譯的動態庫可能存在二進位制相容的問題。

另外一種方案是,如果庫的程式碼量並不大,可以自己組織CMakeList.txt檔案進行編譯,這裡筆者在網上找到了某個大神組織的GIFLIB專案的CMakeList.txt檔案:

# 輸出cmake版本提示
message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")

# cmake的最低版本要求
cmake_minimum_required (VERSION 3.10)

# 工程名稱、版本、語言
project(giflib VERSION 5.2.2)

# 支援當前目錄
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 判斷編譯器型別
message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")

# 原始碼檔案
set(GIF_SRC dgif_lib.c egif_lib.c gifalloc.c gif_err.c gif_font.c gif_hash.c openbsd-reallocarray.c)
set(GIF_HEADER gif_hash.h  gif_lib.h  gif_lib_private.h)
#set(GIF_UTILSRC qprintf.c quantize.c getarg.c)
#set(GIF_UTILHEADER getarg.h)

# 動態庫字首與字尾
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
	set(LibraryPrefix lib)
    set(LibraryPostfix so)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
	set(LibraryPrefix )
    set(LibraryPostfix lib)
ENDIF()

# 將原始碼新增到此專案的可執行檔案。
add_library(${PROJECT_NAME} SHARED ${GIF_SRC} ${GIF_HEADER})

# 判斷編譯器型別
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    message(">> using Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    message(">> using GCC")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
    message(">> using Intel C++")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    message(">> using Visual Studio C++")	  
    add_compile_options(/utf-8 /wd4996)   
    set_property(TARGET ${PROJECT_NAME} PROPERTY LINK_FLAGS
    /DEF:"${CMAKE_SOURCE_DIR}/giflib.def")
else()
    message(">> unknow compiler.")
endif()

# TODO: 如有需要,請新增測試

# 安裝標頭檔案到 include 目錄
install(FILES gif_lib.h DESTINATION include)

# 安裝庫檔案到 lib 目錄
install(TARGETS ${PROJECT_NAME}
        LIBRARY DESTINATION lib  # 對於共享庫
        ARCHIVE DESTINATION lib  # 對於靜態庫
        RUNTIME DESTINATION bin  # 對於可執行檔案
)

基於這個CMakeList.txt,筆者組織了GIFLIB的5.2.2版本,關鍵的構建指令如下所示:

# 配置CMake  
cmake .. -G "$Generator" -A x64 -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$InstallDir"

# 構建階段,指定構建型別
cmake --build . --config RelWithDebInfo

# 安裝階段,指定構建型別和安裝目標
cmake --build . --config RelWithDebInfo --target install

相關文章