【Qt5编译自动化教程】:打造无痛编译流程,提升开发效率!
立即解锁
发布时间: 2025-01-21 01:41:24 阅读量: 82 订阅数: 21 


Buildroot配置与Qt5交叉编译教程
.png&PortalID=0&q=1)
# 摘要
本文深入探讨了Qt5编译自动化技术,涵盖了环境配置、项目初始化、自动化脚本开发、持续集成与自动化部署以及案例研究等方面。通过详细介绍安装Qt5和相关编译工具链、创建项目基础框架、编写和应用自动化脚本、实现持续集成和自动化部署流程,本文旨在为开发者提供一套完整的Qt5项目自动化构建解决方案。结合对复杂项目的自动化实践分析和优化技巧介绍,文章还分享了社区案例,展示了自动化技术在实际工作中的应用效果和价值。
# 关键字
Qt5;自动化构建;持续集成;自动化部署;编译工具链;项目初始化
参考资源链接:[Qt5 configure参数配置详解](https://wenku.csdn.net/doc/1sdiqk1in5?spm=1055.2635.3001.10343)
# 1. Qt5编译自动化基础
在当今软件开发领域,自动化已经成为提高开发效率和降低维护成本的关键。对于使用Qt5的开发者而言,自动化编译不仅能够减少重复劳动,还可以确保构建过程的一致性和可靠性。本章节将带领读者了解Qt5自动化编译的基础概念和应用场景。
首先,我们将介绍自动化编译的基础知识,包括自动化的定义、目的以及它在软件开发周期中的重要性。自动化编译允许开发者通过脚本或工具自动化地执行源代码到可执行程序的转换过程,这对于快速迭代和跨平台开发尤为重要。随着项目规模的增大,自动化编译确保了每一个构建版本的一致性和稳定性,这对于团队协作和持续集成至关重要。
接下来,我们将探讨一些自动化编译的常见工具和方法,以及它们在不同场景下的应用。本章的目的是为读者提供自动化编译的初步了解,并为后续章节中更深入的技术细节打下坚实的基础。
# 2. 环境配置与项目初始化
## 2.1 安装Qt5和编译工具链
### 2.1.1 检查系统依赖
在安装Qt5和编译工具链之前,首先需要检查系统的依赖项是否满足要求。对于大多数Linux发行版,依赖项通常包括开发工具和库文件,这些是构建和安装软件所必需的。
在Debian系的发行版(如Ubuntu)中,依赖项可能包括但不限于:
- `build-essential`
- `cmake`
- `gcc` 或 `g++`
- `make`
可以在终端执行以下命令来安装这些依赖项:
```bash
sudo apt update
sudo apt install build-essential cmake gcc g++ make
```
在Red Hat系的发行版(如Fedora或CentOS)中,依赖项可能包括:
- `Development Tools`
- `Development Libraries`
- `cmake`
相应的安装命令为:
```bash
sudo dnf groupinstall "Development Tools"
sudo dnf install cmake gcc-c++ make
```
### 2.1.2 Qt5安装过程
安装Qt5的过程依赖于您的操作系统和您希望使用的安装类型。对于大多数用户来说,从官方下载器或者包管理器进行安装是最简便的方式。以下是Linux系统下使用包管理器安装Qt5的示例。
对于Ubuntu系统,可以使用以下命令来安装Qt5开发包:
```bash
sudo apt install qt5-default
```
对于Fedora系统:
```bash
sudo dnf install qt5-qtbase-devel
```
Qt5也提供了一个独立的安装包(MaintenanceTool),可以在其官方网站下载。使用这个工具,可以选择安装Qt5的所有组件或仅安装特定的组件和工具。
### 2.1.3 编译工具链的选择与安装
在进行跨平台开发时,选择合适的编译工具链至关重要。例如,如果您需要在Windows平台上为Qt5应用程序构建,通常需要使用到Microsoft Visual Studio。
安装Visual Studio时,可以选择包含C++开发组件的安装配置。在安装过程中,确保包括以下组件:
- C++桌面开发
- Windows 10 SDK
- C++ CMake tools for Windows
通过Visual Studio Installer,您可以自定义这些组件的安装。
此外,对于跨平台开发,您还可以选择使用MinGW-w64或者Clang作为编译器。这可以通过在Linux上安装对应的工具包或使用它们的Windows版本来完成。例如,在Ubuntu上安装MinGW-w64编译器:
```bash
sudo apt install mingw-w64
```
确保在安装过程中选择正确的架构(例如,`i686` 或 `x86_64`),以匹配您的开发需求。
## 2.2 创建Qt5项目基础框架
### 2.2.1 使用Qt Creator初始化项目
Qt Creator 是Qt官方提供的集成开发环境(IDE),用于编写、编译和调试Qt应用程序。启动Qt Creator后,您可以选择“新建项目”来启动项目创建向导。
向导中,您可以选择不同的项目模板,例如“应用程序”、“库”、“控制台应用程序”等,根据您的项目需求来选择合适模板。
1. 选择“应用程序”模板,这将创建一个基本的Qt5图形用户界面应用程序。
2. 给项目命名,并选择一个位置来保存它。
3. 设置项目的构建系统,可以选择qmake(默认)或CMake。
4. 选择要添加的Qt模块,如Core、Gui等。
5. 完成创建,Qt Creator会自动生成项目的基本结构,并打开项目。
### 2.2.2 配置项目文件.pro
每个Qt项目都有一个对应的 `.pro` 文件,它是项目的配置文件,用于定义项目范围内的设置,如源文件、资源、模块依赖等。
一个典型的 `.pro` 文件可能如下所示:
```pro
# 定义项目名称
TARGET = MyProject
# 定义源文件
SOURCES += main.cpp \
mainwindow.cpp
# 定义资源文件
RESOURCES += qml.qrc
# 定义模块依赖
QT += core gui qml
# 定义QML模块路径
QML_IMPORT_PATH += qml/
```
在 `.pro` 文件中,您可以使用不同的变量和函数来配置项目的编译选项和运行时行为。例如,您可以设置编译器标志、资源文件路径、定义预处理器宏等。
### 2.2.3 添加必要的模块和插件
Qt是模块化的,这意味着可以根据需要将不同的模块添加到项目中。例如,如果您打算使用网络功能,需要在 `.pro` 文件中添加 `network` 模块:
```pro
QT += network
```
此外,Qt提供了多种插件,例如样式插件、图像格式插件等,可以根据项目需求在 `.pro` 文件中添加相应的插件模块。
```pro
QT += sql
```
在配置完成后,通常需要在项目中包含新添加模块的头文件和链接相应的库文件,Qt Creator通常会自动处理这些细节。
## 2.3 环境配置小结
环境配置是项目开发中至关重要的一步,确保了项目能在本地计算机上顺利编译和运行。在配置过程中,我们应当注意:
- 依赖于项目的具体需求来安装和配置Qt5及其编译工具链。
- 使用Qt Creator作为项目开发的起点,可以大大提高开发效率。
- `.pro` 文件的配置需要根据项目的具体需求进行详细设置,这需要对Qt构建系统的理解。
在遵循上述步骤之后,我们已经为项目的成功开发奠定了坚实的基础。接下来的章节将深入探讨自动化脚本的开发,这将帮助我们提高项目构建效率并实现持续集成。
# 3. 自动化脚本开发
## 3.1 编写构建脚本的理论基础
### 3.1.1 脚本语言选择与环境搭建
脚本语言是在开发自动化构建过程中不可或缺的工具,它允许开发者通过编写脚本来执行一系列复杂的任务,而无需手动进行重复的构建步骤。选择正确的脚本语言对于整个构建过程的效率和可维护性至关重要。常见的脚本语言包括bash(Bourne Again SHell)、Python、Perl等。每种语言都有其优势和使用场景,而选择哪一种往往取决于开发者的熟练程度以及项目需求。
- **Bash脚本:** Bash是大多数Unix和Linux系统的默认shell。它对于文件系统操作和系统调用非常方便,适合进行环境设置和简单的任务自动化。
- **Python:** Python以其简洁明了的语法和强大的标准库著称。它适合进行复杂的逻辑处理和数据操作,且有着大量的构建和部署相关第三方库。
- **Perl:** Perl是另一种功能强大的脚本语言,它在文本处理方面表现出色。它的灵活性和正则表达式处理能力使其在处理配置文件和生成报告时非常有用。
在本章节中,我们将选择Bash作为构建脚本的示例语言。Bash脚本的一个重要优势是几乎所有的Linux发行版都自带bash shell,这意味着几乎不需要额外安装就可以使用。
#### 实践步骤
1. 打开文本编辑器,创建一个新的文本文件,比如命名为`build.sh`。
2. 在文件的第一行指定脚本使用的解释器,例如:`#!/bin/bash`。
3. 写入你的脚本代码,例如一个简单的hello world脚本如下:
```bash
#!/bin/bash
echo "Hello, World!"
```
4. 保存文件后,需要给予脚本执行权限,可以通过以下命令完成:
```bash
chmod +x build.sh
```
5. 最后,可以直接在终端运行这个脚本:
```bash
./build.sh
```
### 3.1.2 基本的自动化构建原理
自动化构建是指将应用程序的编译、测试、打包等过程自动化,无需人工干预。自动化构建可以大大提高开发效率,减少重复工作,并且通过持续集成保持软件质量。
基本的自动化构建原理包括以下几个步骤:
1. **环境准备:** 确保所有的构建依赖已经安装,包括编译器、库文件等。
2. **源代码获取:** 自动从版本控制系统(如Git)获取最新的源代码。
3. **编译:** 根据源代码和配置文件执行编译指令,生成可执行文件或库文件。
4. **测试:** 自动运行单元测试、集成测试等,确保代码的质量。
5. **打包:** 将编译后的文件打包成安装包或发布包。
6. **部署:** 将打包好的文件部署到测试服务器或者产品服务器上。
自动化构建通常涉及到构建工具和脚本语言的结合使用。构建工具如Make、CMake、Ant、Maven等,提供了强大的依赖管理和构建流程控制。脚本语言则用于编写构建脚本,通过调用构建工具来完成构建任务。
## 3.2 实现Qt5项目的自动化脚本
### 3.2.1 构建脚本的基本结构
构建脚本的基本结构通常遵循以下模式:
1. **声明变量:** 为方便管理,将项目中重复使用的文件路径、编译器选项、构建结果名称等信息定义为变量。
2. **依赖检查:** 确保所有依赖项都已安装并可用。
3. **编译步骤:** 调用编译器编译源代码,生成可执行文件。
4. **测试步骤:** 运行测试套件验证构建的正确性。
5. **打包步骤:** 将构建成功的文件打包成安装包或压缩包。
以下是一个简单的Qt5项目的构建脚本示例:
```bash
#!/bin/bash
# 项目路径
SOURCE_DIR="~/qt5project"
BUILD_DIR="${SOURCE_DIR}/build"
INSTALL_DIR="${SOURCE_DIR}/install"
# 编译选项
CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release"
QT_DIR="/usr/local/Qt-5.15.2"
# 创建构建目录
mkdir -p ${BUILD_DIR}
# 配置项目
pushd ${BUILD_DIR}
cmake ${CMAKE_ARGS} -DCMAKE_PREFIX_PATH=${QT_DIR} ${SOURCE_DIR}
popd
# 编译项目
make -j8
# 运行测试
# ./${BUILD_DIR}/your_test_application
# 打包
# tar -czvf ${INSTALL_DIR}/yourproject-${VERSION}.tar.gz -C ${INSTALL_DIR} .
echo "Build script complete."
```
### 3.2.2 集成Qt5的编译命令
在脚本中集成Qt5的编译命令,需要使用到CMake作为构建系统。CMake能够帮助我们处理不同操作系统下的编译差异,并且很容易与Qt5集成。在上述脚本中,`cmake`命令用于配置项目,它调用CMakeLists.txt文件来定义编译流程。
`-DCMAKE_PREFIX_PATH=${QT_DIR}`参数用于指定Qt5的安装路径,这样CMake能够找到正确的Qt5库和插件。如果Qt5已经正确安装并且环境变量设置正确,CMake将能够自动检测到Qt5并配置相关的构建选项。
### 3.2.3 自定义脚本逻辑和参数解析
在实际使用中,构建脚本通常需要根据不同的环境和需求来进行相应的调整。脚本应提供参数解析功能,允许使用者传递参数来控制构建过程。
例如,脚本可能允许使用者指定构建类型(如Release或Debug),或者选择是否执行测试步骤。下面的代码片段展示了如何使用`getopts`来解析简单的命令行选项:
```bash
#!/bin/bash
# 默认构建类型为 Release
BUILD_TYPE="Release"
# 选项解析
while getopts "d" opt; do
case $opt in
d) BUILD_TYPE="Debug"
;;
?) echo "Usage: $0 [-d]"
exit 1
;;
esac
done
# 其他构建逻辑...
```
脚本的其余部分可以根据`BUILD_TYPE`变量来调整构建和测试的步骤。
## 3.3 脚本的测试与调试
### 3.3.1 测试自动化脚本的流程
自动化脚本测试的目标是确保脚本在各种环境下都能够正确地执行预期的操作。测试过程通常包括单元测试和集成测试。单元测试关注单个脚本函数或段落的正确性,而集成测试则检查整个脚本流程的协同工作情况。
以下是一些测试自动化脚本的基本步骤:
1. **单元测试:** 对脚本中使用的函数和代码片段进行单独测试。
2. **模拟环境:** 使用虚拟机或容器技术创建与生产环境相似的测试环境。
3. **手动测试:** 对脚本进行逐行或逐块的手动检查,确保所有逻辑分支都被考虑。
4. **自动化集成测试:** 使用CI工具(如Jenkins、Travis CI)执行脚本,并检查执行结果是否符合预期。
### 3.3.2 脚本调试技巧和常见问题解决
脚本调试是确保脚本按预期工作的重要环节。在bash脚本中,可以使用一些内置的调试工具和技巧:
1. **跟踪:** 使用`set -x`命令,脚本在执行时会在控制台打印所有执行的命令及其参数。
2. **断点:** 使用`set -v`或`set -n`命令来暂时停止执行脚本,检查某一点的变量值或命令输出。
3. **检查变量:** 在脚本中合理地使用`echo`打印变量值,有助于理解脚本执行到某个步骤时的状态。
4. **错误处理:** 使用`trap`命令捕获脚本中的错误,并进行处理或记录。
例如,调试脚本时,可以这样设置跟踪和错误处理:
```bash
#!/bin/bash
set -x # 开启跟踪
# ...脚本的其余部分...
# 设置一个断点
# set -v
# echo "当前变量的值: $variable"
# 错误处理示例
trap 'echo "Script error!"; exit 1' ERR
# ...脚本的其余部分...
```
在实际开发中,常见的脚本问题包括路径错误、权限不足、依赖未安装等。解决这些问题时,需要仔细检查脚本中的路径设置,确保运行脚本的用户具有足够的权限,以及运行`apt-get`、`yum`等安装必要的依赖包。
通过以上方法,你可以有效地测试和调试自动化脚本,确保它在不同环境和条件下稳定运行。
# 4. 持续集成与自动化部署
## 4.1 持续集成的原理与实践
### 持续集成的定义与好处
持续集成(Continuous Integration,简称CI)是软件开发中的一个实践,它要求开发人员频繁地(可能是每天数次)将代码集成到共享仓库中。每个集成都通过自动化构建(包括编译、运行测试等)来验证,以便尽早发现集成错误。通过持续集成,可以减少集成问题,加快反馈循环,并能够更频繁地发布高质量的软件。
持续集成的好处包括:
- **快速发现错误**:通过自动构建和测试,能够在早期快速发现并定位错误。
- **减少重复过程**:自动化测试减少了手动测试的重复劳动,提高效率。
- **减少集成问题**:频繁集成可以避免集成大块代码所带来的问题。
- **提高软件质量**:持续集成可以保证项目的稳定性和代码质量。
- **快速发布**:集成、测试和部署的自动化使得软件可以更快地到达用户手中。
### 构建自动化流水线
构建自动化流水线是持续集成的核心。它涉及从代码提交到软件发布的整个过程,包括代码编译、静态代码分析、单元测试、集成测试、包构建、部署和发布等步骤。
一个典型的构建流水线应具备以下要素:
- **版本控制**:跟踪和管理源代码。
- **自动化构建**:编译源代码并生成可执行文件。
- **自动化测试**:执行测试脚本,包括单元测试和集成测试。
- **质量检查**:代码质量分析,如代码覆盖率、复杂度分析等。
- **部署**:将软件部署到测试或生产环境。
- **监控与报告**:记录构建过程中的错误,并生成日志和报告。
## 4.2 配置自动化部署工具
### 选择合适的自动化部署工具
自动化部署工具负责将构建好的软件包部署到指定环境。选择一个合适的部署工具对于构建高效、可靠的自动化流水线至关重要。选择部署工具时,需要考虑以下因素:
- **支持的平台**:工具是否支持所有目标部署环境。
- **集成能力**:与持续集成系统和其他工具的集成程度。
- **易用性**:工具的配置和使用是否简单直观。
- **灵活性**:是否可以根据需求进行定制和扩展。
- **可靠性**:部署过程的稳定性,以及出错时的恢复能力。
- **社区和文档**:是否有活跃的社区和完善的文档支持。
常用的自动化部署工具有Jenkins、GitLab CI/CD、GitHub Actions等。
### 部署脚本的编写与测试
部署脚本是自动化部署过程中的关键组件。编写部署脚本需要遵循一定的规范和最佳实践,以确保部署过程的可重复性和一致性。
一个基础的部署脚本通常包含以下步骤:
1. **环境检查**:确保部署环境满足所有前提条件。
2. **准备工作**:清理旧的部署,设置必要的权限等。
3. **部署操作**:将新的软件包传输到服务器,并执行安装或替换旧版本。
4. **验证部署**:通过运行测试或检查服务状态来验证部署成功。
5. **通知和日志记录**:向相关团队成员发送部署结果的通知,并记录详细的日志。
```bash
#!/bin/bash
# 示例部署脚本
# 检查环境变量
if [ -z "$DEPLOY_ENV" ]; then
echo "环境变量DEPLOY_ENV未设置"
exit 1
fi
# 部署前的准备操作
echo "开始部署到环境: $DEPLOY_ENV"
# ...部署前的清理和配置...
# 部署操作
echo "部署软件包"
# 这里可以使用scp、rsync等命令传输文件,或使用包管理器安装软件
# 验证部署
echo "验证部署结果"
# ...执行必要的测试和检查...
# 部署完成
echo "部署成功完成"
```
在实际应用中,部署脚本需要根据具体的部署流程和环境进行详细编写和调整。
## 4.3 集成到版本控制系统
### 配置Git钩子自动触发构建
集成到版本控制系统意味着每次代码提交都能自动触发构建和测试流程。以Git为例,可以通过设置Git钩子来自动触发持续集成流程。
在Git仓库中,可以通过`pre-commit`、`post-commit`、`pre-push`等钩子来实现自动化的CI流程。例如,使用`post-commit`钩子可以配置为每次提交后自动执行CI系统上的构建任务。
```bash
#!/bin/sh
# .git/hooks/post-commit 示例
# 这个脚本会在每次提交后执行
# 调用CI系统API触发构建任务
curl -X POST -H "Content-Type: application/json" -d '{"ref": "'"$GIT_BRANCH"'"}' http://ci.example.com/api/trigger_build
```
确保将此脚本设置为可执行文件,并放置在`.git/hooks/`目录下相应的文件位置。这只是一个简单的例子,实际操作中需要根据使用的CI系统进行相应的调整和配置。
### 实现代码提交后的自动化测试和部署
自动化测试和部署是持续集成流程中不可缺少的部分。自动化测试确保每次代码提交后软件质量得到验证,而自动化部署则负责将经过测试的软件快速部署到各个环境。
要实现代码提交后的自动化测试和部署,需要在版本控制系统中配置相关的钩子,并与CI系统配合工作。以下是一个自动触发测试和部署的流程示例:
1. 开发者提交代码到Git仓库。
2. Git钩子自动触发CI系统的构建任务。
3. CI系统开始执行自动化测试。
4. 如果测试通过,CI系统自动执行部署脚本。
5. 部署脚本将软件包部署到测试或生产环境。
6. 部署完成后进行环境验证。
7. 如果环境验证通过,部署成功结束,否则触发报警。
这个流程通过使用CI/CD工具链实现,确保了软件从开发到交付的每一个步骤都能自动进行,大大提高了开发和运维的效率。
# 5. 案例研究与深入应用
## 5.1 复杂Qt5项目的自动化实践
随着项目规模的增长,自动化构建和部署变得更加重要。在复杂的Qt5项目中,自动化实践可以极大地提升开发效率,减少重复工作。
### 5.1.1 分模块构建策略
在大型项目中,采用分模块构建策略可以有效降低编译时间,并提高代码的可维护性。每个模块可以独立编译和测试,因此,当项目中的某部分发生变化时,不需要重新编译整个项目。
**实践步骤:**
1. 将项目代码逻辑分割成若干模块,每个模块完成特定的功能。
2. 在每个模块目录下创建对应的.pro文件。
3. 在主项目.pro文件中使用`include()`指令引入这些模块的.pro文件。
4. 利用qmake的条件编译指令,控制特定模块的编译。
示例代码如下:
```pro
# main.pro
include(othermodule.pro)
include(thirdparty.pro)
# 其他模块...
# 编译指令
CONFIG += ordered
SOURCES += main.cpp
HEADERS += main.h
# 模块编译控制
OTHER_FILES += anothermodule.cpp
```
### 5.1.2 处理跨平台编译的特殊情况
跨平台开发是Qt5项目常见的需求。不同平台可能有不同的编译器、库依赖和系统API。自动化构建必须能够适应这些差异。
**策略:**
1. 利用qmake的条件编译指令,针对不同平台定制编译选项。
2. 使用环境变量和条件语句控制不同操作系统下的构建脚本行为。
3. 设置平台相关的模块依赖关系,确保只编译当前平台可用的模块。
例如,在构建脚本中使用环境变量:
```bash
#!/bin/bash
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo "Building for Linux"
# Linux平台的特定构建命令
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo "Building for MacOS"
# MacOS平台的特定构建命令
fi
```
## 5.2 自动化工作流的优化技巧
为了提升自动化工作流的效率和可靠性,必须对现有工作流进行优化。
### 5.2.1 代码规范与自动检查
代码规范性是保证项目质量的关键。通过自动化工具定期检查代码风格和规范性,可以减少人为审查的负担。
**工具:**
- `clang-format`:自动格式化代码,保证代码风格一致。
- `cppcheck`:静态代码分析工具,检测C++代码中的潜在问题。
**实践步骤:**
1. 将格式化和检查任务集成到构建系统中。
2. 在持续集成系统中设置自动触发这些任务的钩子。
3. 对于不符合规范的代码,拒绝提交并给出修改建议。
### 5.2.2 性能监控与瓶颈分析
性能监控是优化自动化工作流的重要环节。通过监控系统资源使用情况和运行时性能,可以及时发现瓶颈并进行优化。
**策略:**
1. 使用系统工具如`top`、`htop`监控资源使用情况。
2. 利用专业的性能分析工具(如`Valgrind`)进行内存泄漏和性能瓶颈分析。
3. 集成到自动化测试流程中,定期执行性能测试。
例如,使用`Valgrind`检测内存泄漏的命令:
```bash
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./your_application
```
## 5.3 社区案例分享
社区是学习和分享最佳实践的宝库。通过研究和讨论其他团队的自动化实践,我们可以获得宝贵的启发。
### 5.3.1 国内外成功的自动化案例
在国内外的开源社区和企业中,有许多成功的自动化实践案例,这些案例通常在网上公开发表,有时也会在相关会议上展示。
**案例来源:**
- 开源项目文档
- 技术博客
- 会议演讲和论文
**案例研究方法:**
1. 阅读项目文档,理解其自动化构建和部署策略。
2. 分析博客和文章中的案例,关注遇到的问题和解决方案。
3. 观看会议演讲视频,学习现场的演示和讨论。
### 5.3.2 从社区学习最佳实践和策略
社区成员通常乐于分享他们的经验和知识。通过积极的交流和讨论,可以吸收和应用许多先进的自动化策略。
**参与方式:**
- 参与开源项目和讨论组。
- 关注知名开发者的博客和社交媒体。
- 加入技术论坛和问答社区。
**学习策略:**
1. 提问和回答问题,增加对自动化领域的理解。
2. 发布自己的经验,帮助他人同时加深自己对知识的掌握。
3. 与行业专家进行深入交流,获取第一手经验。
通过这些社区案例的研究和讨论,我们可以不断完善自身的自动化构建和部署流程,确保项目的高质量和高效率开发。
0
0
复制全文
相关推荐







