修订记录
日期 | 修订版本 | 修改章节 |
2024.11.27 | v1.0 | 初始文档 |
2024.12.04 | v1.0 | 新增3.3《头文件、库文件目录规范》 |
新增4.1《公共cmake配置》 | ||
新增4.2《sqlite3.47.1-windows编译》 | ||
2025.02.27 | v1.1 | 修改4.1章节third-common.cmake文件内容 |
增加4.2《工程目录划分》 | ||
2025.03.04 | v1.2 | 修改4.1章节third-common.cmake文件内容 |
2025.03.12 | v1.3 | 修改《第四章 开源库编译实践》章节
|
2025.03.18 | V1.4 | 修改《第四章 开源库编译实践》章节
|
声明:本文章旨在为 C/C++ 开发者提供一份兼具指导性与实用性的开源库编译参考资料。本文章所呈现的所有内容均为原创整理与实践总结,是作者基于大量的实践经验与深入研究精心撰写而成。书中每一项内容均经过严格的上机实践验证,确保其准确性与可行性,旨在为读者提供可靠、有效的技术指引。
需要特别说明的是,本文章将会持续以csdn站内博文地址链接方式更新第四章内容,不断纳入新的开源库信息以及更优的编译实践方法,力求为读者打造一本与时俱进的开源库编译指南,助力广大 C/C++ 开发者在相关项目开发中高效利用开源库资源,提升开发效率与质量。
有不在本文章第四章中的库,可以在评论区留言,有时间时候会为大家提供对应编译的实践文章。
第一章 概述
1.1 目标
本文章在为C/C++开发者提供一份全面、实用的开源库编译指南,尤其侧重于跨平台编译和构建的实际操作。我们将详细介绍在不同操作系统下处理开源库编译的方法,从获取源代码开始,经过配置、编译和安装等各个环节,帮助读者理解并掌握整个过程。
后续章节将围绕具体的平台(如Windows、Linux和macOS)展开深入讲解,分析每个平台的特点和编译过程中的差异。同时,我们还会涉及到常见开源库的案例分析,以及在编译过程中可能遇到的问题及解决方案,让读者在实践中能够顺利完成开源库的跨平台编译和构建任务。
第二章 环境配置
2.1 编译工具
在进行 C/C++ 开源库的跨平台编译时,合适的编译环境是至关重要的。本章将详细介绍在 Windows 10(或者Windows 11实践上没有区别)和 Ubuntu 16.04.5这两个不同操作系统下的编译环境搭建,重点阐述如何使用CMake作为构建工具,并结合Windows上的Visual Studio 2008和Ubuntu上的gcc 4.8.5编译器来实现。
2.2 CMake版本
跨平台构建工具统一使用CMake3.29.8,下载地址https://cmake.org/files/v3.29/,使用该版本的原因是从3.30.0版本起,不再支持生成vs2008的工程,且该版本具备修改指定vs工程(CMakelist中的library、execute)“运行库”选项功能。
windows下载地址:https://cmake.org/files/v3.29/cmake-3.29.8-windows-x86_64.msi
linux下载地址:https://cmake.org/files/v3.29/cmake-3.29.8-linux-x86_64.sh
一般情况下开发环境应该都是x86_64架构的,需要其他架构的下载对应版本即可。
csdn上传一份(不需要积分,“动态调分”设置为“不允许”),避免cmake官网以后出现无法下载的情况。
windows版本CMake3.29.8:https://download.youkuaiyun.com/download/binary0006/90013561
linux版本CMake3.29.8:https://download.youkuaiyun.com/download/binary0006/90013573
2.3 windows环境配置
2.3.1 vs2008安装
vs2008下载:前往MSDN, 我告诉你 - 做一个安静的工具站网站下载如下截图所示版本,勾选如图所示2个安装包,然后点击“已勾选(2)”标签,复制链接在迅雷中下载速度会快些。
安装时先安装zh-Hans_visual_studio_team_system_2008_team_suite_x86_dvd_X14-26452.iso,再安装zh-hans_visual_studio_2008_service_pack_1_x86_dvd_x15-12981.iso,安装比较简单不在此详细描述。
2.4 linux环境配置
linux的开发环境在没有物理机的情况下,需要虚拟一个linux环境,准备使用Ubuntu24.04.1和gcc4.8.5版本,使用VMware-workstation安装ubuntu虚拟机,由于内容过长将配置操作独立一篇文章,详情查看这个链接:
https://blog.youkuaiyun.com/binary0006/article/details/144083894
第三章 库文件命名
3.1 引言
在 C/C++开源库的跨平台编译过程中,统一且清晰的库文件命名规范对于库的管理、使用以及项目集成至关重要。由于存在静态库和动态库这两种不同类型的编译结果,并且在 Windows 平台上还有进一步的编译选项区分(如 md 和 mt),因此建立一套通用的命名规则是十分必要的。
3.2 命名规范
通用规则:对于所有平台编译生成的库文件,统一在动态库文件名后面增加“dll”,静态库文件名后增加“lib”,debug类型编译的在前面的规则基础上,再为文件名后面增加“d”。
例如:如果开源库的原始名称为“mylibrary”,那么debug编译生成的动态库文件名应为“mylibrarydlld”,其静态库文件名应为“mylibrarylibd”,这样的命名方式使得开发者在看到文件名时,能够迅速识别出是debug还是release的动态库或者静态库。
Windows 平台特殊情况:在 Windows 平台,当使用 mt 编译选项时,除了遵循上述通用规则外,需要在文件名后再增加“mt”`,即文件名变为“mylibrarylibmtd”、“mylibrarydllmtd”。这种额外的标识有助于区分不同编译选项下的静态库,方便开发者在特定场景下选择合适的库文件。
库类型 | 平台 | debug | release | |
动态库 | windows(msvc) | md | mylibrarydlld.dll | mylibrarydll.dll |
mt | mylibrarydllmtd.dll | mylibrarydllmt.dll | ||
linux(gcc) | libmylibrarydlld.so | libmylibrarydll.so | ||
静态库 | windows(msvc) | md | mylibrarylibd.lib | mylibrarylib.lib |
mt | mylibrarylibmtd.lib | mylibrarylibmt.lib | ||
linux(gcc) | libmylibrarylibd.a | libmylibrarylib.a |
3.3 头文件、库文件目录规范
库编译完毕后需要提供头文件和库文件给相关研发人员使用,为了便于管理和组织开源库的头文件和库文件。首先需要确定一个统一的根目录(third),在根目录下创建头文件(include)目录,再按照不同的编译器分配不同的库文件目录。原则就是头文件只需要一份,二进制库文件按编译器区分。
以mylibrary库为例,假设该库版本为1.0,对应不同的编译器最终的头文件和库文件目录如下。
3.4 命名规范的优势
提高可读性和可维护性:通过统一的命名规范,无论是开发者自己查看和管理编译生成的库文件,还是其他开发人员接手项目,都能够快速理解每个库文件的类型和特性,降低了理解成本,提高了代码库的可维护性。
避免冲突和混淆:在复杂的项目中,可能会存在多个不同版本或不同编译选项的库。清晰的命名规范可以有效避免库文件之间的命名冲突和混淆,确保项目在链接和使用库文件时能够准确无误地找到所需的库。
便于自动化构建和部署:在自动化构建脚本和部署流程中,统一的命名规范使得脚本编写更加简单和可靠。脚本可以根据文件名准确地识别和处理不同类型的库文件,提高了整个开发流程的效率和稳定性。
第四章 开源库编译实践
4.1 gitee仓库地址
本教程后续所有实践修改的cmake脚本都将会提交到这个仓库https://gitee.com/binary0010/depends。
4.2 公共cmake配置
4.2.1 编译目录配置third-common.cmake
在实际的软件项目开发过程中,开源库一般作为基础库使用,基于这些基础库来完成定制的软件项目功能。一个完整软件项目需要统一规划各功能模块代码目录,开源库虽然只是项目的一部分,仍然需要考虑后期的维护和扩展。
一般来说开源库的代码很少变动,多数情况下是直接复用的,不需要每个研发人员每次都编译,根据3.3章节规范来规划为研发人员提供对应头文件和库文件(sdk)即可。将开源库源代码和sdk分开管理时,考虑到后期会有多个开源库及版本升级场景,使用一个公共的third-common.cmake配置来管理开源库的一些公共配置,目录划分及third-common.cmake内容如下。
# 1.没有调用project时 if(MSVC)不会生效
# 2.当在其他工程中的project(xxxx)之前引用本文件时会导致路径生成不正确
if(NOT DEFINED PROJECT_NAME OR PROJECT_NAME STREQUAL "")
project(third-common)
endif()
# message(STATUS "PROJECT_NAME:${PROJECT_NAME}")
# 开源库sdk根目录
# 获取当前文件的的绝对路径
set(relative_path "${CMAKE_CURRENT_LIST_DIR}/../../third")
# 转换为绝对路径
get_filename_component(third ${relative_path} ABSOLUTE)
# message(STATUS "third:${third}")
# 开源库头文件目录
set(third-include "${third}/include")
# message(STATUS "third-include:${third-include}")
# vs编译器特化设置
if(MSVC)
# 获取编译器信息
# Win32-vc90|Win32-vc140|x64-vc90|...
set(third-bin "${third}/${CMAKE_VS_PLATFORM_NAME}-vc${MSVC_TOOLSET_VERSION}/bin")
set(third-lib "${third}/${CMAKE_VS_PLATFORM_NAME}-vc${MSVC_TOOLSET_VERSION}/lib")
# debug工程生成的二进制文件名后增加“d”字符
set(CMAKE_DEBUG_POSTFIX "d")
# message(STATUS "vs version=${CMAKE_VS_PLATFORM_NAME}-vc${MSVC_TOOLSET_VERSION}")
endif()
# 开源库sdk安装根目录
set(CMAKE_INSTALL_PREFIX "${third}")
# message(STATUS "third sdk root dir=${CMAKE_INSTALL_PREFIX}")
# 设置编译输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/output/lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/output/lib")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/output/bin")
4.2.2 开源库版本配置libversion.cmake
# 统一设置使用的开源库版本号
set(zlib_version 1.3.1)
set(jpeg_version 9f)
4.3 工程目录划分
实际研发过程中一个解决方案(solution)会有N个业务模块项目,在启动研发前合理的规划工程目录,有利于后期代码维护,在本教程中使用如下图所示目录结构来进行源代码工程管理(假设我们要开发一个x-app的项目)。
4.4 sqlite3.47.1-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/144249288
4.5 zlib-1.3.1-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146217522
编译之后增加了公共的FindZLIB.cmake脚本,详细内容请查看文章gitee仓库https://gitee.com/binary0010/depends。
4.6.jpeg-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146234890
编译之后增加了公共的FindJPEG.cmake脚本,详细内容请查看文章gitee仓库https://gitee.com/binary0010/depends。
4.7.tiff-4.0.10-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146425832
4.8.bzip2-1.0.8-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146426285
4.9.libpng-1.6.47-windows编译
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146550660
4.10.brotli-1.1.0-windows
编译步骤:https://blog.youkuaiyun.com/binary0006/article/details/146551410