CMake构建学习笔记6-giflib库的构建

前面构建的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 复制代码
# 输出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版本,关键的构建指令如下所示:

shell 复制代码
# 配置CMake  
cmake .. -G "$Generator" -A x64 -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$InstallDir"

# 构建阶段,指定构建类型
cmake --build . --config RelWithDebInfo

# 安装阶段,指定构建类型和安装目标
cmake --build . --config RelWithDebInfo --target install
相关推荐
charlie1145141911 天前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
CSDN_RTKLIB1 天前
【字符编码】有无BOM的UTF-8
c++
Chary20161 天前
opengl 学习资料路径
c++·opengl
im_AMBER1 天前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
今儿敲了吗1 天前
01|多项式输出
c++·笔记·算法
程序员Jared1 天前
C++11—mutex
c++
朔北之忘 Clancy1 天前
2025 年 9 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·数学·青少年编程·题解
量子炒饭大师1 天前
【C++入门】Cyber底码作用域的隔离协议——【C++命名空间】(using namespace std的原理)
开发语言·c++·dubbo
REDcker1 天前
RTCP 刀尖点跟随技术详解
c++·机器人·操作系统·嵌入式·c·数控·机床
楚Y6同学1 天前
基于 Haversine 公式实现【经纬度坐标点】球面距离计算(C++/Qt 实现)
开发语言·c++·qt·经纬度距离计算