cjpeg配置


# 设置运行时库、库文件(例如静态库或动态库)以及归档文件(如静态库)的输出位置。以下是每一行代码的详细解释:
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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金_chihiro_修行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值