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

CMake构建学习笔记11-minizip库的构建

时间:2024-08-29 21:48:33浏览次数:16  
标签:11 CMake CXX PROJECT 构建 minizip CMAKE message

准确来说,minizip其实是zlib提供的辅助工具,位于zlib库的contrib文件夹内。minizip提供了更为高级一点的接口,能直接操作文件进行压缩。不过,有点麻烦的是这个工具并没有提供CMake构建的方式。那么可以按照构建giflib的方式,自己组织CMakeList.txt,正好这个项目的代码量并不多。

另一个问题是,minizip其实是个可执行程序,Windows下不能直接将其构建成动态链接库,因为Windows下的动态链接库是需要设置导出的,否则就会提示找不到符号的问题。这种情况下最简便的方式就是将其组织成静态库了(项目地址),CMakeList.txt如下所示:

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

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

# 工程名称、版本、语言
project(minizip VERSION 5.2.2)

# 支持当前目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 判断编译器类型
message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")

# 判断编译器类型
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)  
else()
    message(">> unknow compiler.")
endif()

# 查找 ZLIB 模块
find_package(ZLIB REQUIRED)

# 源代码文件
set(PROJECT_SOURCES ioapi.c iowin32.c miniunz.c minizip.c mztools.c unzip.c zip.c)
set(PROJECT_HEADER crypt.h ioapi.h iowin32.h mztools.h unzip.h zip.h)

# 将源代码添加到此项目的可执行文件。
add_library(${PROJECT_NAME} STATIC ${PROJECT_SOURCES} ${PROJECT_HEADER})

#
target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)

# TODO: 如有需要,请添加测试

# 安装头文件到 include 目录
install(FILES ${PROJECT_HEADER} DESTINATION include/${PROJECT_NAME})

# 安装库文件到 lib 目录
install(TARGETS ${PROJECT_NAME}
        LIBRARY DESTINATION lib  # 对于共享库
        ARCHIVE DESTINATION lib  # 对于静态库
        RUNTIME DESTINATION bin  # 对于可执行文件
)

关键的构建指令如下所示:

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

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

# 安装阶段,指定构建类型和安装目标
cmake --build . --config RelWithDebInfo --target install

在最后谈谈动态库和静态库的问题。动态库和静态库各有优缺点,这里就不细致的论述了。但是在Windows下笔者还是倾向于优先使用动态库。一直以来,二进制兼容的问题一直是困扰C/C++编程的重要问题。比如说,你用VS2010编译的动态库在VS2013的环境下可能是无法使用的,这还是同一家产品的不同版本就会造成这个二进制成果的差异性问题。但是,根据Microsoft提供的文档(参看:https://learn.microsoft.com/zh-cn/cpp/porting/binary-compat-2015-2017 ),VS2015以后的版本就会开始提供二进制兼容的特性了,原理是标准库、运行时库(如 msvcp140.dll)、C++ 标准库保证了ABI(二进制接口)的稳定。笔者也确实发现很多产品的MSVC的预编译成果能够在MSVC环境中混用了。比如VS2017编译的Qt就能够在VS2019的环境下正常使用。不过这些能混用的成果一般都是动态库,也就是动态库的二进制兼容特性更好一点。至于静态库,文档中宣称静态库也可以做到,但是笔者实测至少这个基于VS2017的minizip静态库在VS2019中用不了。这一点就留待以后解决了。

标签:11,CMake,CXX,PROJECT,构建,minizip,CMAKE,message
From: https://www.cnblogs.com/charlee44/p/18387592

相关文章

  • python基础(11文件读取)
    python系列文章目录python基础(01变量&数据类型&运算符)python基础(02序列共性)python基础(03列表和元组)python基础(04字符串&字典)python基础(05集合set)python基础(06控制语句)python基础(07函数)python基础(08类和对象)python基础(09闭包&装饰器)python基础(10异常处理)文章......
  • 【TVM 教程】构建图卷积网络
    更多TVM中文文档可访问→https://tvm.hyper.ai/本文介绍如何用Relay构建图卷积网络(GCN)。本教程演示在Cora数据集上运行GCN。Cora数据集是图神经网络(GNN)的benchmark,同时是支持GNN训练和推理的框架。我们直接从DGL库加载数据集来与DGL进行同类比较。pipinstallt......
  • 使用Flask快速构建Web后端项目:Python、Flask、Mysql、Migrate、SQLAlchemy、Login、Se
    Flask是一个用Python编写的轻量级Web应用框架。它设计简单且易于扩展,如果与Jinja2模板引擎和WerkzeugWSGI工具集结合使用,Flask可以用来快速开发小型到中型的网站。Flask鼓励快速开发和简洁的代码,同时保持了扩展性和灵活性。本文旨在如何使用Flask及其相关组件快......
  • Effective Java理解笔记系列-第2条-何时考虑用构建器?
    类中有几个必选参数,且存在大量可选参数时。大量指至少有4个可选指大部分实例只在某几个可选域存在非零值,其他都是零。如:publicclassNutritionFacts{ privatefinalintservingSize;//每份含量,必选 privatefinalintservings;//每罐含量,必选 privatefinalintcalor......
  • gstreamer教程(8)——构建应用之Pad和Pad的能力集
    Pad和能力集:正如我们在 Elements 中看到的那样,pad是Element与外部世界的接口。数据从一个Element的sourcepad流向另一个Element的sinkpad。元素可以处理的媒体类型都是通过pad的能力集公布的。我们将在本章后面详细讨论功能(参见 pad的功能)。Pad:pad类......
  • 【Markdown笔记】设置字体颜色——转载https://blog.csdn.net/u012028275/article/det
     【Markdown笔记】设置字体颜色dadalaohua于2021-04-0517:53:19发布阅读量5.7w 收藏 293点赞数103分类专栏: Markdown笔记 文章标签: markdown latex html版权GitCode开源社区文章已被社区收录加入社区Markdown笔记专......
  • 第九章 动态规划Part11
    目录任务1143.最长公共子序列思路1035.不相交的线思路53.最大子数组和思路392.判断子序列思路任务1143.最长公共子序列给定两个字符串text1和text2,返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列,返回0。一个字符串的子序列是指这样一个新的字......
  • gstreamer教程(7)——构建应用之Bus的使用
    Bus总线:bus总线是一个简单的系统,它负责将消息从流线程转发到其自己的线程上下文中的应用程序。总线的优点是,即使GStreamer本身是大量线程的,应用程序也不需要线程感知即可使用GStreamer。默认情况下,每个pipeline管道都包含一条bus总线,因此应用程序不需要创建总......
  • 一起学Java(11)-[日志篇]教你分析SLF4J源码,掌握Logger接口实现类加载原理
    最近各种事情很忙,今天继续。在第十篇(一起学Java(10)-为项目引入Log框架(Log篇二-引入SLF4J接口层框架))中,我们为项目(https://github.com/lihongzheshuai/java-all-in-one)引入了SLF4J和Logback框架,按计划通过阅读源码研究下SLF4J的实现原理。全文详见个人独立博客:https://ww......
  • 【MySQL数据库管理问答题】第11章 执行备份
    目录 1.在使用mysqlbackup进行备份时,对于InnoDB存储引擎都会备份哪些文件?2.使用mysqlbackup进行恢复时,copy-back命令执行了哪些操作?3.mysqldump和mysqlpump实用程序在功能上有哪些相同和不同的地方?4.原始二进制备份在什么条件下是可以跨平台进行移植的?5.......