经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
CMake构建学习笔记6-giflib库的构建
来源:cnblogs  作者:charlee44  时间:2024/8/26 9:17:05  对本文有异议

前面构建的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文件:

  1. # 输出cmake版本提示
  2. message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")
  3. # cmake的最低版本要求
  4. cmake_minimum_required (VERSION 3.10)
  5. # 工程名称、版本、语言
  6. project(giflib 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. set(GIF_SRC dgif_lib.c egif_lib.c gifalloc.c gif_err.c gif_font.c gif_hash.c openbsd-reallocarray.c)
  13. set(GIF_HEADER gif_hash.h gif_lib.h gif_lib_private.h)
  14. #set(GIF_UTILSRC qprintf.c quantize.c getarg.c)
  15. #set(GIF_UTILHEADER getarg.h)
  16. # 动态库前缀与后缀
  17. IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
  18. set(LibraryPrefix lib)
  19. set(LibraryPostfix so)
  20. ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
  21. set(LibraryPrefix )
  22. set(LibraryPostfix lib)
  23. ENDIF()
  24. # 将源代码添加到此项目的可执行文件。
  25. add_library(${PROJECT_NAME} SHARED ${GIF_SRC} ${GIF_HEADER})
  26. # 判断编译器类型
  27. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  28. message(">> using Clang")
  29. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  30. message(">> using GCC")
  31. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  32. message(">> using Intel C++")
  33. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  34. message(">> using Visual Studio C++")
  35. add_compile_options(/utf-8 /wd4996)
  36. set_property(TARGET ${PROJECT_NAME} PROPERTY LINK_FLAGS
  37. /DEF:"${CMAKE_SOURCE_DIR}/giflib.def")
  38. else()
  39. message(">> unknow compiler.")
  40. endif()
  41. # TODO: 如有需要,请添加测试
  42. # 安装头文件到 include 目录
  43. install(FILES gif_lib.h DESTINATION include)
  44. # 安装库文件到 lib 目录
  45. install(TARGETS ${PROJECT_NAME}
  46. LIBRARY DESTINATION lib # 对于共享库
  47. ARCHIVE DESTINATION lib # 对于静态库
  48. RUNTIME DESTINATION bin # 对于可执行文件
  49. )

基于这个CMakeList.txt,笔者组织了GIFLIB的5.2.2版本,关键的构建指令如下所示:

  1. # 配置CMake
  2. cmake .. -G "$Generator" -A x64 -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="$InstallDir"
  3. # 构建阶段,指定构建类型
  4. cmake --build . --config RelWithDebInfo
  5. # 安装阶段,指定构建类型和安装目标
  6. cmake --build . --config RelWithDebInfo --target install

原文链接:https://www.cnblogs.com/charlee44/p/18379758

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号