首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月25日 22:08

前面构建的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
From:https://www.cnblogs.com/charlee44/p/18379758
本文地址: http://shuzixingkong.net/article/1432
0评论
提交 加载更多评论
其他文章 推荐2款实用的持续集成与部署(CI&CD)自动化工具
前言 最近DotNetGuide技术社区交流群有不少同学在咨询:持续集成与部署(CI&CD)自动化工具有什么好用的推荐?今天大姚给大家推荐2款实用且免费的持续集成与部署(CI&CD)自动化工具,希望可以帮助到有需要的同学。 持续集成与部署工具的作用 持续集成(CI)和持续交付/部署(
推荐2款实用的持续集成与部署(CI&CD)自动化工具 推荐2款实用的持续集成与部署(CI&CD)自动化工具 推荐2款实用的持续集成与部署(CI&CD)自动化工具
Linux系统性能调优技巧
Linux系统性能调优是一个复杂而细致的过程,它涉及到硬件、软件、配置、监控和调优策略等多个方面。以下将详细阐述Linux系统性能调优的技巧: 一、硬件优化 CPU优化 选择适合的CPU:根据应用需求选择多核、高频的CPU,以满足高并发和计算密集型任务的需求。 CPU缓存优化:确保CPU缓存(L1、
题解:SP22382 ETFD - Euler Totient Function Depth
题目链接: link,点击这里喵。 前置知识: 【模板】线性筛素数,欧拉函数,点击这里喵。 题意简述: 给定整数 $l,r,k$,求出 $[l,r]$ 中有多少个整数不断对自己取欧拉函数刚好 $k$ 次结果为 $1$。 思路: 看眼数据范围,$10^{10}$ 的量级显然不容我们每次暴力,故考虑预处
Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
众所周知,苹果MacOs系统虽然贵为Unix内核系统,但由于系统不支持N卡,所以如果想在本地跑AI项目,还需要对相关的AI模块进行定制化操作,本次我们演示一下如何将基于Python3.11的AI项目程序打包为MacOS可以直接运行的DMG安装包,可以苹果系统中一键运行AI项目。 MacOs本地部署A
Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon) Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon) Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
【LLM训练系列】NanoGPT源码详解和中文GPT训练实践
本文是【训练LLM系列】的第一篇,主要重点介绍NanoGPT代码以及中文、英文预训练实践。最新版参见我的知乎:https://zhuanlan.zhihu.com/p/716442447 除跑通原始NanoGPT代码之外,分别使用了《红楼梦》、四大名著和几十本热门网络小说,进行了字符级、自行训练to
【LLM训练系列】NanoGPT源码详解和中文GPT训练实践 【LLM训练系列】NanoGPT源码详解和中文GPT训练实践 【LLM训练系列】NanoGPT源码详解和中文GPT训练实践
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿,推荐或自荐优质文章/项目/学习资源等。每周
C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25) C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25) C#/.NET/.NET Core技术前沿周刊 | 第 2 期(2024年8.19-8.25)
使用 Nuxt 的 showError 显示全屏错误页面
title: 使用 Nuxt 的 showError 显示全屏错误页面 date: 2024/8/26 updated: 2024/8/26 author: cmdragon excerpt: 摘要:本文介绍Nuxt.js中的showError方法用于显示全屏错误页面,包括其参数类型及使用方式,并演
使用 Nuxt 的 showError 显示全屏错误页面 使用 Nuxt 的 showError 显示全屏错误页面
互联工厂数据交换标准:IPC-CFX
本文我们一起了解下IPC-CFX标准产生的背景 和 用途,它是机器设备之间通信的“统一语言”,是大家都懂的“普通话”而不是“方言”。IPC-CFX使用AMQP v1.0传输协议实现安全的连接,使用JSON进行数据编码,提供了明确的消息结构和数据内容,确保即插即用,它或许是工业4.0应用的基础。
互联工厂数据交换标准:IPC-CFX 互联工厂数据交换标准:IPC-CFX 互联工厂数据交换标准:IPC-CFX