首页 > 其他分享 >CMake构建学习笔记6-giflib库的构建

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

时间:2024-08-25 23:03:39浏览次数:10  
标签:set CMAKE lib GIF giflib 构建 CMake message

前面构建的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

标签:set,CMAKE,lib,GIF,giflib,构建,CMake,message
From: https://www.cnblogs.com/charlee44/p/18379758

相关文章

  • 机器学习之——决策树构建原理
    0前言本文主要讲述了决策树背后的数学原理以及构建方法,并通过实例数据一步步构建决策树,帮助读者理解。本文使用了大量的配图帮助读者理解。1理论基础1.1决策树的原型决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割......
  • 使用 Python 构建简易图书馆借阅系统
    本文将介绍一个简单的图书管理系统的实现。这个系统用Python编写,可以帮助我们管理图书馆中的图书,包括新增图书、借阅图书、归还图书以及显示图书馆当前藏书的状态。引言图书馆是提供信息和知识的重要场所。为了更好地管理图书馆中的图书,我们需要一个简单易用的管理系统。下......
  • 【数据结构-前缀异或和】力扣1177. 构建回文串检测
    给你一个字符串s,请你对s的子串进行检测。每次检测,待检子串都可以表示为queries[i]=[left,right,k]。我们可以重新排列子串s[left],…,s[right],并从中选择最多k项替换成任何小写英文字母。如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果为......
  • CMake构建学习笔记5-libtiff库的构建
    libtiff是一个开源库,用于读写TIFF(TaggedImageFileFormat)文件。使用CMake进行构建的关键指令如下所示:#配置CMakecmake..-G"$Generator"-Ax64`-DCMAKE_BUILD_TYPE=RelWithDebInfo`-DCMAKE_PREFIX_PATH="$InstallDir"`-DCMAKE_INSTALL_PREFIX="$In......
  • CMake构建学习笔记4-libjpeg库的构建
    libjpeg是一个广泛使用的开源库,用于处理JPEG(JointPhotographicExpertsGroup)图像格式的编码、解码、压缩和解压缩功能,是许多图像处理软件和库的基础。libjpeg本身的构建没什么特别的,不过值得说道的是libjpeg存在一个高性能分支叫做libjpeg-turbo,通过汇编代码使用SIMD(SingleIns......
  • CMake 保姆级教程
    1.CMake概述        CMake是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile,通过make命令进行项目的构建,大多是IDE软件都集成了make,比如:VS的nmake、linux下的GNUmake、Qt的qmake等,如果自己动手写makefile,会发现,makefile通常依赖......
  • JavaScript 构建一个简单的待办事项应用
    包含添加、删除、标记任务功能。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>TodoList&......
  • 在Python虚拟环境中利用PyInstaller高效构建可执行EXE文件的专业指南
    使用虚拟环境(如venv或conda)来打包Python程序为exe文件是一个很好的实践,因为它可以确保应用程序在不同的环境中具有一致性和可移植性。然而,需要注意的是,虚拟环境本身并不直接提供将Python程序打包成exe文件的功能。这通常需要使用专门的打包工具,如PyInstaller、cx_Freeze或py......
  • WebRTC 实时通信:构建高效网页视频通话的秘诀
    标题:WebRTC实时通信:构建高效网页视频通话的秘诀WebRTC(WebReal-TimeCommunications),即网页实时通信技术,是一种支持浏览器间无需额外插件即可实现音视频实时通信的API。本文将深入探讨WebRTC的基本概念、关键技术,并通过示例代码展示如何在网页中实现实时视频通话功能,让您快......
  • Ruby Web服务开发:构建高效RESTful API的秘诀
    标题:RubyWeb服务开发:构建高效RESTfulAPI的秘诀Ruby作为一种灵活、高效的编程语言,通过其丰富的库和框架,为开发Web服务提供了强大的支持。本文将深入探讨如何在Ruby中开发Web服务,特别是RESTfulAPI。我们将从基础概念讲起,逐步深入到框架选择、路由配置、控制器编写、模型设......