# 设置运行时库、库文件(例如静态库或动态库)以及归档文件(如静态库)的输出位置。以下是每一行代码的详细解释:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/..)
# 这段代码的作用是确保无论在何种配置下构建,都使用动态链接的CRT库,而不是静态链接的版本。这通常是为了生成的可执行文件可以更小,并且减少对特定CRT版本的依赖,因为动态链接的CRT可以在系统上共享。
# if(MSVC)
# # Build all configurations against shared C library
# foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
# CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
# if(${var} MATCHES "/MT")
# string(REGEX REPLACE "/MT" "/MD" ${var} "${${var}}")
# endif()
# endforeach()
# endif()
# 添加 jpeg的库
# foreach(src ${JPEG_SOURCES})
# set(JPEG_SRCS ${JPEG_SRCS} ../${src})
# endforeach()
# 当项目启用了SIMD优化并且正在使用Visual Studio或Xcode IDE时,告诉CMake某些对象文件是生成的,以便正确处理它们的构建依赖关系。
if(WITH_SIMD AND(MSVC_IDE OR XCODE))
# This tells CMake that the "source" files haven't been generated yet
set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
endif()
# 这段CMake代码是在Windows平台上(WIN32条件下)设置一个导入/导出符号定义文件(.def 文件)的路径。.def 文件用于在创建Windows DLL时指定哪些函数应当导出供其他模块调用。下面是代码的具体解释:
# if(WIN32)
# if(WITH_MEM_SRCDST)
# set(DEFFILE ../win/jpeg${SO_MAJOR_VERSION}-memsrcdst.def)
# else()
# set(DEFFILE ../win/jpeg${SO_MAJOR_VERSION}.def)
# endif()
# endif()
# 总结来说,这段代码的功能是在MSVC环境下,从模板文件jpeg.rc.in生成一个资源文件jpeg.rc,并将它加入到构建过程中的源文件列表中,确保资源文件被正确处理和包含在最终的输出中。这种做法常见于Windows平台上的项目,因为Windows程序通常需要资源文件来包含图标、菜单、对话框等非代码资源。
# if(MSVC)
# configure_file(${CMAKE_SOURCE_DIR}/win/jpeg.rc.in
# ${CMAKE_BINARY_DIR}/win/jpeg.rc)
# set(JPEG_SRCS ${JPEG_SRCS} ${CMAKE_BINARY_DIR}/win/jpeg.rc)
# endif()
# 综合起来,这一行代码告诉CMake:
# 创建一个名为jpeg的共享库。
# 使用在JPEG_SRCS中定义的所有源文件。
# 包含由.def文件定义的导出符号。
# 添加由simd目标产生的对象文件。
# 并且包含在SIMD_OBJS中列出的额外对象文件。
# add_library(jpeg SHARED ${JPEG_SRCS} ${DEFFILE} $<TARGET_OBJECTS:simd>
# ${SIMD_OBJS})
# m是数学库(math library)的简写。
# if(UNIX)
# target_link_libraries(jpeg m)
# endif()
# 这段代码的作用是设置jpeg共享库的版本信息,包括主版本号(SOVERSION)和完整的版本字符串(VERSION)。
# set_target_properties(jpeg PROPERTIES SOVERSION ${SO_MAJOR_VERSION}
# VERSION ${SO_MAJOR_VERSION}.${SO_AGE}.${SO_MINOR_VERSION})
# 这段CMake代码是在苹果(Apple)系统上进行特定配置的,主要是为了处理动态库(shared library)的运行时路径(runtime path)问题。
# if(APPLE AND(NOT CMAKE_OSX_DEPLOYMENT_TARGET OR
# CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER 10.4))
# if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
# set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
# endif()
# set_target_properties(jpeg PROPERTIES MACOSX_RPATH 1)
# endif()
# 这段CMake代码是在特定条件下设置目标属性,用于生成符号映射文件(symbol map file)。以下是详细的解释:
# if(MAPFLAG)
# set_target_properties(jpeg PROPERTIES
# LINK_FLAGS "${MAPFLAG}${CMAKE_CURRENT_BINARY_DIR}/../libjpeg.map")
# endif()
# 如果使用MSVC编译器:设置jpeg库的运行时输出名称为jpeg{SO_MAJOR_VERSION},其中{SO_MAJOR_VERSION}是库的主要版本号。配置链接器选项以避免默认链接C运行时库LIBCMT和LIBCMTD,这通常是为了防止链接警告或错误,尤其是当库中已包含这些运行时库的部分时。如果使用MinGW编译器:设置jpeg库的后缀为-{SO_MAJOR_VERSION}.dll,这意味着动态库的文件名将包含其主要版本号。
# if(MSVC)
# set_target_properties(jpeg PROPERTIES
# RUNTIME_OUTPUT_NAME jpeg${SO_MAJOR_VERSION})
# # The jsimd_*.c file is built using /MT, so this prevents a linker warning.
# set_target_properties(jpeg PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTD")
# elseif(MINGW)
# set_target_properties(jpeg PROPERTIES SUFFIX -${SO_MAJOR_VERSION}.dll)
# endif()
# 这段代码的作用是在Windows平台上定义一个预处理器宏USE_SETMODE,这可能用于在源代码中启用与Windows兼容性相关的一些特性,比如使用_setmode()函数来将文件描述符转换为Windows的文件句柄,这在进行I/O操作时很有用。这个宏的定义可以影响源代码中条件编译的逻辑,确保代码在Windows上能够正确地工作。
# if(WIN32)
# set(USE_SETMODE "-DUSE_SETMODE")
# endif()
# 这段CMake代码基于项目配置动态设定编译标志和源文件列表,以支持不同的图像格式。具体如下:
# - 如果`WITH_12BIT`配置选项启用,仅设置GIF和PPM图像格式的支持宏定义。
# - 如果`WITH_12BIT`未启用,除了GIF和PPM之外,还启用BMP和Targa格式支持,并相应地设置读写这些格式的源文件。
# - 另外,如果`PNG_SUPPORTED`配置选项启用,还会添加PNG格式的支持宏定义和读取PNG格式的源文件,并报告PNG阅读支持的启用状态。
# 这样做的目的是根据项目需求灵活地调整编译选项和源文件,以支持或不支持特定的图像格式,从而实现代码的模块化和定制化。
if(WITH_12BIT)
set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED ${USE_SETMODE}")
else()
set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
set(CJPEG_BMP_SOURCES ../rdbmp.c ../rdtarga.c)
set(DJPEG_BMP_SOURCES ../wrbmp.c ../wrtarga.c)
if(PNG_SUPPORTED)
report_option(PNG_SUPPORTED "PNG reading support")
set(COMPILE_FLAGS "${COMPILE_FLAGS} -DPNG_SUPPORTED")
set(CJPEG_BMP_SOURCES ${CJPEG_BMP_SOURCES} ../rdpng.c)
endif()
endif()
add_executable(cjpeg ../cjpeg.c ../cdjpeg.c ../rdgif.c ../rdppm.c ../rdjpeg.c
../rdswitch.c ${CJPEG_BMP_SOURCES})
set_property(TARGET cjpeg PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
target_link_libraries(cjpeg jpeg)
if(PNG_SUPPORTED)
# to avoid finding static library from CMake cache
unset(PNG_LIBRARY CACHE)
unset(PNG_LIBRARY_RELEASE CACHE)
unset(PNG_LIBRARY_DEBUG CACHE)
unset(ZLIB_LIBRARY CACHE)
unset(ZLIB_LIBRARY_RELEASE CACHE)
unset(ZLIB_LIBRARY_DEBUG CACHE)
set(CMAKE_PREFIX_PATH "C:/Code/vcpkg-master/packages/libpng_x64-windows;C:/Code/vcpkg-master/packages/libpng_x64-windows/bin;C:/Code/vcpkg-master/packages/zlib_x64-windows;C:/Code/vcpkg-master/packages/zlib_x64-windows/bin")
find_package(PNG 1.6 REQUIRED)
find_package(ZLIB REQUIRED)
target_include_directories(cjpeg PUBLIC ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
target_link_libraries(cjpeg ${PNG_LIBRARY} ${ZLIB_LIBRARY})
endif()
# 段CMake脚本创建了一个名为djpeg的可执行文件,它包含了多个源文件,编译时会应用之前定义的COMPILE_FLAGS中的宏定义和其他编译选项,并且在链接时会链接到jpeg库,以便使用JPEG库提供的功能。这种结构在复杂的软件项目中很常见,可以确保可执行文件正确地集成库的功能,并且能够根据项目配置支持不同的图像格式。
# add_executable(djpeg ../djpeg.c ../cdjpeg.c ../rdcolmap.c ../rdswitch.c
# ../wrgif.c ../wrppm.c ${DJPEG_BMP_SOURCES})
# set_property(TARGET djpeg PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
# target_link_libraries(djpeg jpeg)
# CMake脚本创建了一个名为jpegtran的可执行文件,它包含了多个源文件,并在编译时应用了${USE_SETMODE}宏定义。此外,它还将链接到jpeg库,以便使用JPEG库的功能。这样的结构在软件项目中很常见,确保了可执行文件能够正确地集成库的功能,并根据项目配置或目标平台的特性进行适当的编译。
# add_executable(jpegtran ../jpegtran.c ../cdjpeg.c ../rdswitch.c ../transupp.c)
# target_link_libraries(jpegtran jpeg)
# set_property(TARGET jpegtran PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
# CMake脚本创建了一个名为jcstest的可执行文件,它依赖于JPEG库。jcstest可执行文件将包含jcstest.c中的代码,并且能够利用JPEG库的功能,比如解码和编码JPEG图像。
# add_executable(jcstest ../jcstest.c)
# target_link_libraries(jcstest jpeg)
# 这段CMake代码配置了安装规则,用于将构建的`jpeg`库及其相关工具安装到系统的特定目录。具体包括:1. 将`jpeg`库的头文件、静态库、动态库安装到`CMAKE_INSTALL_LIBDIR`和`CMAKE_INSTALL_INCLUDEDIR`。2. 将`jpeg`库的导入配置文件导出,方便其他项目引用。3. 将`cjpeg`, `djpeg`, `jpegtran`三个工具的可执行文件安装到`CMAKE_INSTALL_BINDIR`。
install(TARGETS jpeg EXPORT ${CMAKE_PROJECT_NAME}Targets
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS cjpeg djpeg jpegtran
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
# 综上所述,这段代码的作用是在满足条件时(CMake版本至少为3.1,使用MSVC编译器,且链接器支持PDB),将jpeg库的PDB文件安装到${CMAKE_INSTALL_BINDIR}目录下。这在调试和分析阶段非常有用,因为PDB文件包含了丰富的符号和调试信息,可以帮助开发者理解编译后的代码结构和变量状态。
if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
CMAKE_C_LINKER_SUPPORTS_PDB)
install(FILES "$<TARGET_PDB_FILE:jpeg>"
DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
endif()
cjpeg配置
最新推荐文章于 2024-08-29 00:44:32 发布