前面我们讨论了如何通过CMake构建zlib、libpng、libjpeg和libtiff等库,但有些依赖库并没有提供CMakeList.txt文件,比如GIFLIB。GIFLIB是一个开源的C库,用于处理GIF(图形交换格式)图像文件。
GIFLIB是一个典型的基于Linux环境的开源库,使用Makefile组织项目配置文件,在Linux环境中通过make工具进行构建。但是在Windows下,构建就变得有些麻烦。一种方案是安装MSYS2(Minimal SYStem 2),它提供了一个类Unix shell环境,包括make工具和MinGW(Minimalist GNU for Windows)。但是这种方案比较繁琐,而且Windows下MinGW编译的库和MSVC编译的动态库可能存在二进制兼容性问题。
另一种方案是,如果库的代码量不大,可以自己组织CMakeList.txt文件进行编译。我们找到了某位大神组织的GIFLIB项目的CMakeList.txt文件,可以帮助我们在Windows下构建GIFLIB库。
# 输出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
未经允许不得转载:大白鲨游戏网 » 在Windows下如何构建GIFLIB库