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

打印 上一主题 下一主题

主题 559|帖子 559|积分 1677

准确来说,minizip其实是zlib提供的辅助工具,位于zlib库的contrib文件夹内。minizip提供了更为高级一点的接口,能直接操作文件举行压缩。不过,有点麻烦的是这个工具并没有提供CMake构建的方式。那么可以按照构建giflib的方式,本身组织CMakeList.txt,恰好这个项目的代码量并不多。
另一个问题是,minizip其实是个可实行步伐,Windows下不能直接将其构建成动态链接库,因为Windows下的动态链接库是需要设置导出的,否则就会提示找不到符号的问题。这种环境下最轻便的方式就是将其组织成静态库了(项目地址),CMakeList.txt如下所示:
  1. # 输出cmake版本提示
  2. message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")
  3. # cmake的最低版本要求
  4. cmake_minimum_required (VERSION 3.10)
  5. # 工程名称、版本、语言
  6. project(minizip VERSION 5.2.2)
  7. # 支持当前目录
  8. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  9. # 判断编译器类型
  10. message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
  11. # 判断编译器类型
  12. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  13.     message(">> using Clang")
  14. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  15.     message(">> using GCC")
  16. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  17.     message(">> using Intel C++")
  18. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  19.     message(">> using Visual Studio C++")          
  20.     add_compile_options(/utf-8 /wd4996)  
  21. else()
  22.     message(">> unknow compiler.")
  23. endif()
  24. # 查找 ZLIB 模块
  25. find_package(ZLIB REQUIRED)
  26. # 源代码文件
  27. set(PROJECT_SOURCES ioapi.c iowin32.c miniunz.c minizip.c mztools.c unzip.c zip.c)
  28. set(PROJECT_HEADER crypt.h ioapi.h iowin32.h mztools.h unzip.h zip.h)
  29. # 将源代码添加到此项目的可执行文件。
  30. add_library(${PROJECT_NAME} STATIC ${PROJECT_SOURCES} ${PROJECT_HEADER})
  31. #
  32. target_link_libraries(${PROJECT_NAME} ZLIB::ZLIB)
  33. # TODO: 如有需要,请添加测试
  34. # 安装头文件到 include 目录
  35. install(FILES ${PROJECT_HEADER} DESTINATION include/${PROJECT_NAME})
  36. # 安装库文件到 lib 目录
  37. install(TARGETS ${PROJECT_NAME}
  38.         LIBRARY DESTINATION lib  # 对于共享库
  39.         ARCHIVE DESTINATION lib  # 对于静态库
  40.         RUNTIME DESTINATION bin  # 对于可执行文件
  41. )
复制代码
关键的构建指令如下所示:
  1. # 配置CMake  
  2. cmake .. -G "$Generator" -A x64 `
  3. -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo `
  4. -DCMAKE_PREFIX_PATH="$InstallDir" `
  5. -DCMAKE_INSTALL_PREFIX="$InstallDir"
  6. # 构建阶段,指定构建类型
  7. cmake --build . --config RelWithDebInfo
  8. # 安装阶段,指定构建类型和安装目标
  9. 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中用不了。这一点就留待以后办理了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表