jpeg-windows编译

        本文操作按照《c&c++开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。

        c&c++开源库编译指南:https://blog.csdn.net/binary0006/article/details/144086155

        本文章中的源代码已提交到gitee仓库,地址:https://gitee.com/binary0010/depends/tree/master/c/jpeg-9f

1 jpeg编译

1.1源代码下载

        源代码下载地址:http://www.ijg.org,直接下载最新版,当前最新版本为9f,直接下载即可,其他版本的编译方式应该也是一样的。

        也可以知己复制这个地址下载:http://www.ijg.org/files/jpegsrc.v9f.tar.gz 

1.2windwos编译

        先解压源代码到指定目录,jpegsrc.v9f.tar.gz文件解压缩后的文件比较多,我们只关心跟jpeg图片库相关的文件即可。

1.2.1生成jconfig.h文件

        由于jpeg的解压的源代码中缺少jconfig.h文件,查看目录中makefile.vc文件内容看出jconfig.h就是jconfig.vc文件的拷贝,手动拷贝一份jconfig.vc文件并重命名为jconfig.h

1.2.2动态库源代码修改

        编译jpeg动态库需要修改一小部分源代码,在代码根目录增加一个jdef.h文件,修改jmoreconfig.h文件部分代码

        jdef.h文件内容:

#ifndef JDEF_H
#define JDEF_H

#if defined(__GNUC__) && !defined(__MINGW32__)
#define JPEG_API
#define _stdcall
#define __stdcall
#define WINAPI
#elif defined(__MINGW32__)

#elif defined(_MSC_VER)
#include <Windows.h>
#   ifdef JPEG_DLL
#       ifdef JPEG_EXPORTS
#           define JPEG_API __declspec(dllexport)
#       else
#           define JPEG_API __declspec(dllimport)
#       endif // JPEG_EXPORTS
#   endif
#endif

#endif // JDEF_H

        jmorecfg.h文件修改的代码:

        32行增加代码。

        249行增加代码。 

        给出一份代码,方便复制粘贴。 

#if defined(_MSC_VER) 
#ifdef JPEG_DLL
#define EXTERN(type)        JPEG_API type
#else
#define EXTERN(type)        extern type
#endif
#else
#define EXTERN(type)        extern type
#endif

1.2.3编写CMakeList脚本

       直接在解压缩的根目录中创建CMakeLists.txt文件,CMakeLists.txt文件内容如下,在这个CMakeList脚本文件中创建了jpeg的动态库和静态库文件。

cmake_minimum_required(VERSION 3.15)
set(CMAKE_WARN_VS9=OFF)
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

if(POLICY CMP0091)
    # https://stackoverflow.com/a/56490614
    cmake_policy(SET CMP0091 NEW)
endif()

project(jpeg LANGUAGES C)
set(VERSION "9f")

# 公共配置
include(../../cmake/third-common.cmake)

set(INSTALL_BIN_DIR "${third-bin}/${PROJECT_NAME}-${VERSION}" CACHE PATH "Installation directory for executables")
set(INSTALL_LIB_DIR "${third-lib}/${PROJECT_NAME}-${VERSION}" CACHE PATH "Installation directory for libraries")
set(INSTALL_INC_DIR "${third-include}/${PROJECT_NAME}-${VERSION}" CACHE PATH "Installation directory for headers")

# vs编译器特化设置
set(JPEG_PUBLIC_HEAD
    jconfig.h
    jerror.h
    jpeglib.h
    jdef.h
    jmorecfg.h
)

set(JPEG_INTERNAL_HEAD
    jdct.h
    jinclude.h
    jmemsys.h
    jmorecfg.h
    jpegint.h
    jversion.h
)

set(JPEG_SRCS
    jaricom.c
    jcapimin.c
    jcapistd.c
    jcarith.c
    jccoefct.c
    jccolor.c
    jcdctmgr.c
    jchuff.c
    jcinit.c
    jcmainct.c
    jcmarker.c
    jcmaster.c
    jcomapi.c
    jcparam.c
    jcprepct.c
    jcsample.c
    jctrans.c
    jdapimin.c
    jdapistd.c
    jdarith.c
    jdatadst.c
    jdatasrc.c
    jdcoefct.c
    jdcolor.c
    jddctmgr.c
    jdhuff.c
    jdinput.c
    jdmainct.c
    jdmarker.c
    jdmaster.c
    jdmerge.c
    jdpostct.c
    jdsample.c
    jdtrans.c
    jerror.c
    jfdctflt.c
    jfdctfst.c
    jfdctint.c
    jidctflt.c
    jidctfst.c
    jidctint.c
    jmemmgr.c
    jmemnobs.c
    jquant1.c
    jquant2.c
jutils.c)

# 动态库工程
add_library(jpegdll SHARED ${JPEG_PUBLIC_HEAD} ${JPEG_INTERNAL_HEAD} ${JPEG_SRCS})
if(MSVC)
    target_compile_definitions(jpegdll PRIVATE JPEG_DLL JPEG_EXPORTS)
endif()

# 静态库工程
add_library(jpeglib STATIC ${JPEG_PUBLIC_HEAD} ${JPEG_INTERNAL_HEAD} ${JPEG_SRCS})

# vs编译器特化设置
if(MSVC)
    # mt动态库工程
    add_library(jpegdllmt SHARED ${JPEG_PUBLIC_HEAD} ${JPEG_SRCS})
    target_compile_definitions(jpegdllmt PRIVATE JPEG_DLL JPEG_EXPORTS)
    set_property(TARGET jpegdllmt PROPERTY
        MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

    # mt静态库工程
    add_library(jpeglibmt STATIC ${JPEG_PUBLIC_HEAD} ${JPEG_SRCS})
    set_property(TARGET jpeglibmt PROPERTY
        MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

    # 查找pdb文件
    file(GLOB_RECURSE JPEG_DEBUG_SYMBOLS ${PROJECT_BINARY_DIR}/output/
        FILES_MATCHING PATTERN "jpeg*.pdb")
endif()

# 安装编译输出的二进制文件
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
    install(TARGETS jpeglib jpegdll jpeglibmt jpegdllmt
        RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
        ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
        LIBRARY DESTINATION "${INSTALL_LIB_DIR}")
endif()

# 安装外部开发时需要的头文件
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
    install(FILES ${JPEG_PUBLIC_HEAD} DESTINATION "${INSTALL_INC_DIR}")
endif()

# 安装pdb文件
if(NOT SKIP_INSTALL_SYMBOLS AND NOT SKIP_INSTALL_ALL)
    install(FILES ${JPEG_DEBUG_SYMBOLS} DESTINATION "${INSTALL_BIN_DIR}")
endif()

1.2.4vs2008编译

        CMakeLists.txt文件编写好之后,只需要使用CMake工具生成vs2008的工程即可,操作步骤按下面描述操作即可。

1.2.4.1cmake构建目录设置

        选择源代码根目录(CMakeLists.txt文件在这个目录),设置build目录为源代码根目录下的cmake-vs2008绝对路径为D:/x-app/depends/c/jpeg-9f,保证源代码目录干净,会生成工程和临时文件,同时也方便后续有其他的构建工具扩展管理。

1.2.4.2应用CMake配置 

        点击“Configure”会弹出编译器选择对话框,这里选择“Visual Studio 9 2008”点击“Finish”按钮等待配置参数完成。

1.2.4.3生成vs解决方案 

        下面的红色警告忽略不用管,意思是未来的cmake版本不再支持生成vs2008的解决方案。 

 1.2.4.4编译工程

        使用vs2008打开“jpeg.sln”解决方案文件,分别编译Debug和RelWithDebInfo配置。 

 1.2.4.5安装库文件、头文件

        编译Install工程的Debug和RelWithDebInfo配置,.h文件和编译生成.dll、.lib、pdb文件会拷贝CMakeList.txt中设置的路径下。

        至此通过一个CMakeLists配置文件将windows下vs2008常用编译类型的库全部编译出来了,最终库的对应关系如下。

库类型

运行库类型

库文件

动态库

mdd

jpegdlld.dll、jpegdlld.lib

md

jpegdll.dll、jpegdll.lib

mtd

jpegdllmtd.dll、jpegdllmtd.lib

mt

jpegdllmt.dll、jpegdllmt.lib

静态库

mdd

jpeglibd.lib

md

jpeglib.lib

mtd

jpeglibmtd.lib

mt

jpeglibmt.lib

备注:使用动态库时,需要在工程中添加JPEG_DLL宏

1.2.5vs2015编译

        vs2015编译与vs2008相同的,只需要在CMake生成工程时选择vs2015即可,其他版本的vs也是一样的,选择需要使用的vs版本即可,此处只演示一下vs2015的编译。
        因为前面生成过vs2008的工程,需要将build目录设置成cmake-vs2015,再“Configure”选择vs2015即可,其他操作就是一样的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

binary0010

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

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

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

打赏作者

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

抵扣说明:

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

余额充值