c&c++开源库编译指南

 修订记录

日期

修订版本

修改章节

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

修改《第四章 开源库编译实践》章节

  1. 增加gitee仓库地址
  2. 工程目录调整,同步对应截图

2025.03.18

V1.4

修改《第四章 开源库编译实践》章节

  1. 增加zlib、jpeg编译实践文章链接地址

        声明:本文章旨在为 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

binary0010

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

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

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

打赏作者

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

抵扣说明:

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

余额充值