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