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

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

时间:2024-08-30 14:37:08浏览次数:12  
标签: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:楚门加速器p ),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/westworldss/p/18388736

相关文章

  • 如何使用clouddrive 在QNAP 威联通中挂载阿里云盘、天翼云盘、115网盘等
    hello大家好,我是你们的新伙伴,稳重的大王~创作立场:原创不易,拒绝搬运~》》日常求粉~QNAP威联通自带的hybridmount以及HBS3,虽然可以做到挂载、同步网盘数据,但是支持的国内网盘有限,本文给大家介绍一款非常好用的软件——clouddrive文章后面贴上app安装包下载地址,下载下来之后,......
  • 在数小时内构建 CRM:你需要了解的顶级无代码/低代码工具
    或许你在阅读这篇文章时,心里会有一个疑问:在类似Salesforce这样强大的传统CRM系统已经如此成熟的今天,为什么企业还需要选择用低代码或无代码平台来构建CRM呢?传统CRM系统确实功能强大,但它们也有一些不可忽视的痛点。对于很多企业,尤其是中小型企业,高昂成本和复杂性让他们望而却......
  • 在数小时内构建 CRM:你需要了解的顶级无代码/低代码工具
    或许你在阅读这篇文章时,心里会有一个疑问:在类似Salesforce这样强大的传统CRM系统已经如此成熟的今天,为什么企业还需要选择用低代码或无代码平台来构建CRM呢?传统CRM系统确实功能强大,但它们也有一些不可忽视的痛点。对于很多企业,尤其是中小型企业,高昂成本和复杂性让他们望而......
  • laravel11+vue项目
    laravel11+vue项目视频地址https://www.youtube.com/watch?v=s6P1dDfl56s&list=PL38wFHH4qYZUdIKP9jG371N3G4kbWAg2c&index=2项目初始化地址直接下载https://github.com/JonVadar/Laravel-Inertia-Vue-Starter``composerinstallnpminstall复制.env.example文件并将其......
  • 代码随想录day45 || 115 不同子序列, 583 两个字符串删除操作, 72 编辑距离
    115不同子序列funcnumDistinct(sstring,tstring)int{ //动态规划,思考一下判断连续和不连续的区别,如果相等都是左上角+1,如果不等,连续情况就是直接等于左上角,不连续情况直接归零 //dp[i][j]表示s[i]中存在t[j]结尾的的个数 //递推公式,不要求连续字串,所以,如果s[i......
  • 使用 nuxi build 命令构建你的 Nuxt 应用程序
    title:使用nuxibuild命令构建你的Nuxt应用程序date:2024/8/30updated:2024/8/30author:cmdragonexcerpt:nuxibuild命令是构建Nuxt应用程序的核心工具,它将你的应用程序打包成适合生产环境的格式。通过理解和使用不同的选项,如--prerender、--dotenv和--log-......
  • 11种建立持久客户关系的有效方法
    有些机构成功地建立了一个稳固的客户基础,并随着时间的推移不断壮大,而另一些机构则经历了大起大落,最终关闭。有什么不同呢?就是客户关系。牢固的客户关系能够带来更成功的项目和活动、一批忠诚的客户以及更好的品牌声誉。更重要的是,这还能让日常工作变得更加愉快。那么,什么才是......
  • oracle 11g 调整sga和pga大小
    oracle10g11g调整sga和pga大小-----------------------------------------------------------------------2024年8月22日14:18:48----bayaimn-------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++......
  • Oracle 11g 数据库内存原理
    转自:1、https://blog.csdn.net/ly7472712/article/details/1162393882、https://www.cnblogs.com/prognani/archive/2012/05/14/2500679.htmlOracle11g数据库内存管理-----------------------------------------------------------------------------一、Oracle数据库内......
  • [转帖]11GR2数据库审计日志自动清理
    审计日志如果把SYSTEM表空间撑爆,也会导致数据库停摆,且11g默认审计是开启状态。今天就遇到了这样的情况,写了下面脚本来实现自动清理工作,记录操作过程。TRUNCATETABLESYS.AUD$REUSESTORAGE;--对于已经被审计日志撑爆的数据库或者初始化清理工作时报错ORA-46267,强烈建议用......