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版本提示
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
CMake构建学习笔记6-giflib库的构建的更多相关文章
- 【学习笔记】开源库之 - sigslot (在解决浅拷贝问题的基础上增加信号拦截功能)
前言说明 在文中<[学习笔记]开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)>已经介绍过 sigslot ,此文主要应用在实际的工作项目中时,发现会有拦截信号的需 ...
- iOS学习笔记16-数据库SQLite
一.数据库 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等.离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式: 归档:NSKeyedArchiver 偏好设置:NSU ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- CMake学习笔记五-依赖库添加
# # 项目名称 # SET(WIS_PROJECT_NAME EXAMPLE) # dependencies SET(DEPENDENCIES #依赖第三方库 ) #Qt模块 SET(QT_MODU ...
- 《Spring实战》学习笔记-第五章:构建Spring web应用
之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. ...
- [No000094]SVN学习笔记4-版本库概念与部分日常操作
基本概念 版本库 Subversion 使用集中的数据库,它包含了所有的版本控制文件及其完整历史.这个数据库就是版本库.版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subver ...
- 重温JSP学习笔记--JSTL标签库
以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...
- OpenGL学习笔记0——安装库
最近需要做一个基于Zigbee室内无线定位的系统,受到TI公司ZigBee Sensor Monitor软件的启发,打算用OpenGL来做一个3D显示空间内物体位置的程序.学习阶段选择VS2010+O ...
- 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)
1.一种标签语言 day13 l JSTL标签库(重点) l 自定义标签(理解) l MVC设计模式(重点中的重点) l Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL ...
随机推荐
- STM32学习笔记:创建标准库工程模板
背景 标准库下载:地址 本章的项目可以在这里下载. STM32作为一类经典的MCU.本人从2018年1月1日开始对于STM32系列单片机的学习. 本人所持的型号为:STM32F429ZI-DISCOV ...
- [UG 二次开发 PYTHON] 添加螺纹规格
NX 1988 系列 在添加螺纹特征时,不能自定义螺纹规格, 从网上找到的资料上讲,改一个XML文件,在文件中添加自定义的螺纹规格,从而实现需要的效果. 自己写了一个小程序,方便手动添加螺纹规格. 效 ...
- SpringCloud 微服务简介
一.认识微服务随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.单体架构:将业务的所有功能集中在一个项目中开发,打成一 ...
- PHP7新特性之类型声明
今天我在这里总结下PHP7主要的新特性. 1.类型声明 做过php开发的小伙伴们都知道,php7以前的版本变量是不需要声明类型的,函数返回值也是不需要声明类型的,总之,在我们的脑海中就没有这么回事.可 ...
- 题解:P9777 [HUSTFC 2023] Fujisaki 讨厌数学
令 \(f(n)=x^{n}+x^{-n}\). 可以发现 \(f(n)f(m)=x^{n-m}+x^{m-n}+x^{n+m}+x^{-n-m}=f(n-m)+f(m+n)\). 若 \(m=1\) ...
- CF1929B Sasha and the Drawing 题解
CF1929B 题意 给定一个 \(n\times n\) 的正方形,已知正方形最多有 \(4\times n-2\) 条对角线,要求要有至少 \(k\) 条对角线经过至少一块黑色方格,求至少要将几条 ...
- typora下载安装以及notepad++下载安装
notepad++下载安装 找到浏览器输入:notepad或者 https://notepad-plus-plus.org/downloads/ 官网下载即可使用 如果官网崩了,可以在微信公众号:A软 ...
- 从DDPM到DDIM(三) DDPM的训练与推理
从DDPM到DDIM(三) DDPM的训练与推理 前情回顾 首先还是回顾一下之前讨论的成果. 扩散模型的结构和各个概率模型的意义.下图展示了DDPM的双向马尔可夫模型. 其中\(\mathbf{x}_ ...
- 仓颉编程语言技术指南:嵌套函数、Lambda 表达式、闭包
本文分享自华为云社区<[华为鸿蒙开发技术]仓颉编程语言技术指南[嵌套函数.Lambda 表达式.闭包]>,作者:柠檬味拥抱. 仓颉编程语言(Cangjie)是一种面向全场景应用开发的通用编 ...
- 记一次springboot整合rabbitMQ的list序列化问题
问题:平时传一个类的时候都会继承Serializable实现正确传输,这次我把list<Object>直接丢成了message,导致rabbitMQ不能序列化对象.报错 org.sprin ...