本文操作按照《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即可,其他操作就是一样的了。