

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CMake 用于构建 适用于 C\+\+ 的 AWS SDK
<a name="cmake-params"></a>

使用本节中列出的[CMake](https://cmake.org/)参数来自定义 SDK 的构建方式。

您可以使用 CMake GUI 工具或命令行使用 *-D* 来设置这些选项。 例如：

```
cmake -DENABLE_UNITY_BUILD=ON -DREGENERATE_CLIENTS=1
```

## 一般 CMake 变量和选项
<a name="cmake-general-options"></a>

以下是影响 SDK 源代码构建过程的常规 **`cmake`** 变量和选项。

**注意**  
在为适用于 C\+\+ 的 SDK 本身构建 SDK 源代码时，请使用这些参数。

**Topics**
+ [ADD\_CUSTOM\_CLIENTS](#cmake-add-custom-clients)
+ [AUTORUN\_UNIT\_TESTS](#cmake-AUTORUN_UNIT_TESTS)
+ [AWS\_AUTORUN\_ld\_Library\_Path](#cmake-AWS_AUTORUN_LD_LIBRARY_PATH)
+ [AWS\_SDK\_WARNINGS\_ARE\_ERRORS](#cmake-AWS_SDK_WARNINGS_ARE_ERRORS)
+ [AWS\_USE\_CRYPTO\_SHARED\_LIBS](#cmake-use-crypto)
+ [AWS\_TEST\_区域](#cmake-AWS_TEST_REGION)
+ [BUILD\_BENCHMARKS](#cmake-BUILD_BENCHMARKS)
+ [BUILD\_DEPS](#cmake-BUILD_DEPS)
+ [BUILD\_ONLY](#cmake-build-only)
+ [BUILD\_OPTEL](#cmake-BUILD_OPTEL)
+ [BUILD\_SHARED\_LIBS](#cmake-build-shared-libs)
+ [BYPASS\_DEFAULT\_PROXY](#cmake-BYPASS_DEFAULT_PROXY)
+ [CPP\_STANDARD](#cmake-cpp-standard)
+ [CURL\_INCLUDE\_DIR](#cmake-curl-include-dir)
+ [CURL\_LIBRARY](#cmake-curl-library)
+ [CUSTOM\_MEMORY\_MANAGEMENT](#cmake-custom-memory-management)
+ [禁用\_INTERNAL\_ \_ IMDSV1 CALLS](#cmake-DISABLE_INTERNAL_IMDSV1_CALLS)
+ [ENABLE\_ADDRESS\_SANITIZER](#cmake-ENABLE_ADDRESS_SANITIZER)
+ [ENABLE\_CURL\_LOGGING](#cmake-enable-curl-logging)
+ [ENABLE\_HTTP\_CLIENT\_TESTING](#cmake-ENABLE_HTTP_CLIENT_TESTING)
+ [ENABLE\_RTTI](#cmake-enable-rtti)
+ [ENABLE\_TESTING](#cmake-enable-testing)
+ [ENABLE\_UNITY\_BUILD](#cmake-enable-unity-build)
+ [ENABLE\_VIRTUAL\_OPERATIONS](#cmake-virtual-op)
+ [ENABLE\_ZLIB\_REQUEST\_COMPRESSION](#cmake-ENABLE_ZLIB_REQUEST_COMPRESSION)
+ [FORCE\_CURL](#cmake-force-curl)
+ [FORCE\_SHARED\_CRT](#cmake-force-shared-crt)
+ [G](#cmake-g)
+ [MINIMIZE\_SIZE](#cmake-minimize-size)
+ [NO\_ENCRYPTION](#cmake-no-encryption)
+ [NO\_HTTP\_CLIENT](#cmake-no-http-client)
+ [REGENERATE\_CLIENTS](#cmake-regenerate-clients)
+ [REGENERATE\_DEFAULTS](#cmake-regenerate-defaults)
+ [SIMPLE\_INSTALL](#cmake-simple-install)
+ [TARGET\_ARCH](#cmake-target-arch)
+ [USE\_CRT\_HTTP\_CLIENT](#cmake-USE_CRT_HTTP_CLIENT)
+ [USE\_IXML\_HTTP\_REQUEST\_2](#cmake-USE_IXML_HTTP_REQUEST_2)
+ [USE\_OPENSSL](#cmake-use-openssl)
+ [USE\_TLS\_V1\_2](#cmake-USE_TLS_V1_2)
+ [USE\_TLS\_V1\_3](#cmake-USE_TLS_V1_3)

### ADD\_CUSTOM\_CLIENTS
<a name="cmake-add-custom-clients"></a>

根据 API 定义构建任意客户端。将您的定义放在 `code-generation/api-definitions` 文件夹中，然后将此参数传递给 **`cmake`**。**`cmake`** 配置步骤会生成您的客户端，并将其作为子目录包含在构建版本中。这对于生成 C\+\+ 客户端以使用您的某个 [API Gateway](https://aws.amazon.com/api-gateway) 服务特别有用。例如：

```
-DADD_CUSTOM_CLIENTS="serviceName=myCustomService,version=2015-12-21;serviceName=someOtherService,version=2015-08-15"
```

**注意**  
要使用 `ADD_CUSTOM_CLIENTS` 参数，您必须在 `PATH` 中安装 [Python 2.7](https://www.python.org/downloads/)、Java（[JDK 1.8\+](http://openjdk.java.net/install/)）和 [Maven](https://maven.apache.org/)。

### AUTORUN\_UNIT\_TESTS
<a name="cmake-AUTORUN_UNIT_TESTS"></a>

如果为 `ON`，则在构建后自动运行单元测试。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### AWS\_AUTORUN\_ld\_Library\_Path
<a name="cmake-AWS_AUTORUN_LD_LIBRARY_PATH"></a>

要追加到 LD\_LIBRARY\_PATH 中的路径以供单元测试自动运行。 CMake如果覆盖的依赖项需要自定义运行时库，请设置此路径。

值  
 *字符串。*

默认  
 *不适用* 

### AWS\_SDK\_WARNINGS\_ARE\_ERRORS
<a name="cmake-AWS_SDK_WARNINGS_ARE_ERRORS"></a>

如果为 `ON`，则将编译器警告视为错误。如果在新的或不常见的编译器上发现错误，请尝试将此参数设置为 `OFF`。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### AWS\_USE\_CRYPTO\_SHARED\_LIBS
<a name="cmake-use-crypto"></a>

如果找到共享加密库，则强制 FindCrypto 使用该库。将此选项设置为 `OFF` 可使用[BUILD\_SHARED\_LIBS](#cmake-build-shared-libs)的设置。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### AWS\_TEST\_区域
<a name="cmake-AWS_TEST_REGION"></a>

 AWS 区域 用于集成测试的。

值  
 *字符串。*

默认  
 *不适用* 

### BUILD\_BENCHMARKS
<a name="cmake-BUILD_BENCHMARKS"></a>

如果为 `ON`，则构建基准可执行文件。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### BUILD\_DEPS
<a name="cmake-BUILD_DEPS"></a>

如果为 `ON`，则构建第三方依赖项。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### BUILD\_ONLY
<a name="cmake-build-only"></a>

仅构建要使用的客户端。如果设置为高级别 SDK，例如 `aws-cpp-sdk-transfer`，*BUILD\_ONLY* 会解析任何低级别客户端依赖项。它还会构建与您选择的项目相关的集成和单元测试（如果存在）。这是一个列表参数，其值由分号（`;`）字符分隔。例如：

```
-DBUILD_ONLY="s3;cognito-identity"
```

**注意**  
无论 *BUILD\_ONLY* 参数的值如何设置，始终都会构建核心 SDK 模块 `aws-sdk-cpp-core`**。

### BUILD\_OPTEL
<a name="cmake-BUILD_OPTEL"></a>

如果为 `ON`，则构建跟踪的开放遥测实现。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### BUILD\_SHARED\_LIBS
<a name="cmake-build-shared-libs"></a>

一个内置 CMake 选项，为了便于查看，此处重新公开。如果为 `ON`，它会构建共享库；否则，它只构建静态库。

**注意**  
要动态链接到 SDK，必须使用该 SDK 为所有构建目标定义 `USE_IMPORT_EXPORT` 符号。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### BYPASS\_DEFAULT\_PROXY
<a name="cmake-BYPASS_DEFAULT_PROXY"></a>

如果是`ON`，则在使用 IXml HttpRequest 2 时绕过计算机的默认代理设置。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### CPP\_STANDARD
<a name="cmake-cpp-standard"></a>

指定用于 C\+\+ 14 和 17 代码库的自定义 C\+\+ 标准。

值  
 *11* \| *14* \| *17* 

默认  
 *11* 

### CURL\_INCLUDE\_DIR
<a name="cmake-curl-include-dir"></a>

curl 的路径包括包含 `libcurl` 标题的目录。

值  
 *所选 `include` 目录的字符串路径。例如，`D:/path/to/dir/with/curl/include`。*

默认  
 *不适用* 

### CURL\_LIBRARY
<a name="cmake-curl-library"></a>

要链接的 curl 库文件的路径。该库可以是静态库或导入库，具体取决于您的应用程序需求。

值  
 *curl 库文件的字符串路径。例如，`D:/path/to/static/libcur/file/ie/libcurl.lib.a`。*

默认  
 *不适用* 

### CUSTOM\_MEMORY\_MANAGEMENT
<a name="cmake-custom-memory-management"></a>

要使用自定义内存管理器，请将该值设置为 `1`。您可以安装自定义分配器，以便所有 STL 类型均使用自定义分配接口。如果将该值设置为 `0`，则可能仍需要使用 STL 模板类型来帮助确保 Windows 上的 DLL 安全。

如果静态链接为 `ON`，则自定义内存管理默认为关闭**（`0`）。如果动态链接为 `ON`，则自定义内存管理默认为开启**（`1`），并避免交叉 DLL 分配和解除分配。

**注意**  
为防止出现链接器不匹配错误，必须在整个构建系统中使用相同的值（`0` 或 `1`）。

要安装自己的内存管理器来处理 SDK 的分配，必须为依赖该 SDK 的所有构建目标进行设置 `-DCUSTOM_MEMORY_MANAGEMENT` 和定义 `USE_AWS_MEMORY_MANAGEMENT`。

### 禁用\_INTERNAL\_ \_ IMDSV1 CALLS
<a name="cmake-DISABLE_INTERNAL_IMDSV1_CALLS"></a>

如果为 `ON`，则不会对[实例元数据服务](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)的 V1 API 进行内部调用。如果是`OFF`，则如果 IMDSv2 呼叫失败， IMDSv1 则 IMDSv2 呼叫将回退为使用。有关 IMDSv1 和的更多信息 IMDSv2，请参阅 *Amazon EC2 用户指南*中的[使用实例元数据服务访问实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### ENABLE\_ADDRESS\_SANITIZER
<a name="cmake-ENABLE_ADDRESS_SANITIZER"></a>

如果为 `ON`，则为 gcc 或 clang 开启地址清理器。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### ENABLE\_CURL\_LOGGING
<a name="cmake-enable-curl-logging"></a>

如果为 `ON`，则将 curl 的内部日志通过管道传输到 SDK 记录器。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### ENABLE\_HTTP\_CLIENT\_TESTING
<a name="cmake-ENABLE_HTTP_CLIENT_TESTING"></a>

如果为 `ON`，则构建并运行相应的 HTTP 客户端测试套件。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### ENABLE\_RTTI
<a name="cmake-enable-rtti"></a>

控制 SDK 是否在构建时启用运行时类型信息（RTTI）。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### ENABLE\_TESTING
<a name="cmake-enable-testing"></a>

控制是否在 SDK 构建期间生成单元测试和集成测试项目。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### ENABLE\_UNITY\_BUILD
<a name="cmake-enable-unity-build"></a>

如果为 `ON`，则大多数 SDK 库都是作为单个生成的 `.cpp` 文件构建的。这可以显著减少静态库大小并加快编译速度。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### ENABLE\_VIRTUAL\_OPERATIONS
<a name="cmake-virtual-op"></a>

此参数通常与 `REGENERATE_CLIENTS` 配合使用以生成代码。

如果 `ENABLE_VIRTUAL_OPERATIONS` 为 `ON`，且 `REGENERATE_CLIENTS` 为 `ON`，则服务客户端中与操作相关的函数将被标记为 `virtual`。

如果 `ENABLE_VIRTUAL_OPERATIONS` 为 `OFF`，且 `REGENERATE_CLIENTS` 为 `ON`，则 `virtual` 不会添加到操作函数中，服务客户端类将被标记为 `final`。

如果 `ENABLE_VIRTUAL_OPERATIONS` 为 `OFF`，SDK 还将在编译时为 gcc 和 clang 添加 `-ffunction-sections` 和 `-fdata-sections` 编译器标志。

有关更多信息，请参阅上的[CMake 参数](https://github.com/aws/aws-sdk-cpp/blob/main/docs/CMake_Parameters.md#enable_virtual_operations) GitHub。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### ENABLE\_ZLIB\_REQUEST\_COMPRESSION
<a name="cmake-ENABLE_ZLIB_REQUEST_COMPRESSION"></a>

对于支持它的服务，请求内容将被压缩。如果依赖项可用，则默认处于开启状态。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### FORCE\_CURL
<a name="cmake-force-curl"></a>

仅适用于 Windows。如果为 `ON`，则强制使用 curl 客户端，而不是默认的 [WinHTTP](https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx) 数据传输提供程序。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### FORCE\_SHARED\_CRT
<a name="cmake-force-shared-crt"></a>

如果为 `ON`，则 SDK 将**动态链接到 C 运行时；否则，它将使用 *BUILD\_SHARED\_LIBS* 设置（有时是向后兼容早期版本 SDK 所必需的）。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### G
<a name="cmake-g"></a>

生成构建构件，例如 Visual Studio 解决方案和 Xcode 项目。

例如，在 Windows 上：

```
-G "Visual Studio 12 Win64"
```

有关更多信息，请参阅您的平台 CMake 文档。

### MINIMIZE\_SIZE
<a name="cmake-minimize-size"></a>

[ENABLE\_UNITY\_BUILD](#cmake-enable-unity-build) 的超集。如果为 `ON`，则此选项将打开 *ENABLE\_UNITY\_BUILD* 和其他二进制文件大小缩小设置。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### NO\_ENCRYPTION
<a name="cmake-no-encryption"></a>

如果为 `ON`，则阻止将默认的特定于平台的密码学实现内置到库中。设为 *ON* 可注入您自己的密码学实现。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### NO\_HTTP\_CLIENT
<a name="cmake-no-http-client"></a>

如果为 `ON`，则阻止将默认的特定于平台的 HTTP 客户端内置到库中。如果为 *ON*，则需要提供自己的特定于平台的 HTTP 客户端实现。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### REGENERATE\_CLIENTS
<a name="cmake-regenerate-clients"></a>

如果为 `ON`，则此参数会删除所有生成的代码，然后从 `code-generation/api-definitions` 文件夹生成客户端目录。例如：

```
-DREGENERATE_CLIENTS=1
```

**注意**  
要使用 `REGENERATE_CLIENTS` 参数，您必须在 `PATH` 中安装 [Python 2.7](https://www.python.org/downloads/)、Java（[JDK 1.8\+](http://openjdk.java.net/install/)）和 [Maven](https://maven.apache.org/)。

### REGENERATE\_DEFAULTS
<a name="cmake-regenerate-defaults"></a>

如果为 `ON`，则此参数会删除所有生成的默认代码，然后从 `code-generation/defaults` 文件夹重新生成这些代码。例如：

```
-DREGENERATE_DEFAULTS=1
```

**注意**  
要使用 `REGENERATE_DEFAULTS` 参数，您必须在 `PATH` 中安装 [Python 2.7](https://www.python.org/downloads/)、Java（[JDK 1.8\+](http://openjdk.java.net/install/)）和 [Maven](https://maven.apache.org/)。

### SIMPLE\_INSTALL
<a name="cmake-simple-install"></a>

如果为 `ON`，则安装过程不会在 `bin/` 和 `lib/` 下方插入平台特定的中间目录。如果您需要在单个安装目录下发布多平台版本，则设为 `OFF`。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### TARGET\_ARCH
<a name="cmake-target-arch"></a>

要针对移动平台进行交叉编译或构建，则必须指定目标平台。默认情况下，构建会检测主机操作系统并针对检测到的操作系统进行构建。

**注意**  
当 *TARGET\_ARCH* 为 *ANDROID* 时，还有其他选项可用。请参阅[安卓 CMake 变量和选项](#cmake-android-variables)。

值  
 *WINDOWS* \| *LINUX* \| *APPLE* \| *ANDROID* 

### USE\_CRT\_HTTP\_CLIENT
<a name="cmake-USE_CRT_HTTP_CLIENT"></a>

如果`ON`，请使用通用运行时 HTTP 客户端，并且未构建或包含旧系统（例如 WinHttp 和 libcurl）。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### USE\_IXML\_HTTP\_REQUEST\_2
<a name="cmake-USE_IXML_HTTP_REQUEST_2"></a>

仅适用于 Windows。如果是`ON`，则使用 com 对象 IXml HttpRequest 2 作为 HTTP 堆栈。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### USE\_OPENSSL
<a name="cmake-use-openssl"></a>

如果是`ON`，则软件开发工具包使用 OpenSSL 构建；否则，则使用 OpenSSL 进行构建。[https://github.com/awslabs/aws-lc](https://github.com/awslabs/aws-lc) `AWS-LC`是由密码学团队为其客户维护的通用 AWS 密码库 AWS 。禁用该参数（设置为 `OFF`）会在系统默认目录中安装 `AWS-LC` 作为 OpenSSL 的替代项。如果您的系统中已经安装了 OpenSSL，请不要使用它。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### USE\_TLS\_V1\_2
<a name="cmake-USE_TLS_V1_2"></a>

如果为 `ON`，HTTP 客户端会强制执行 TLS 1.2。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### USE\_TLS\_V1\_3
<a name="cmake-USE_TLS_V1_3"></a>

如果为 `ON`，HTTP 客户端会强制执行 TLS 1.3。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

## 安卓 CMake 变量和选项
<a name="cmake-android-variables"></a>

在创建 SDK 的 Android 版本时（[TARGET\_ARCH](#cmake-target-arch) 设置为 *ANDROID*），请使用以下变量。

**Topics**
+ [ANDROID\_ABI](#cmake-android-abi)
+ [ANDROID\_BUILD\_CURL](#cmake-ANDROID_BUILD_CURL)
+ [ANDROID\_BUILD\_OPENSSL](#cmake-ANDROID_BUILD_OPENSSL)
+ [ANDROID\_BUILD\_ZLIB](#cmake-ANDROID_BUILD_ZLIB)
+ [安卓\_原生\_ API\_LEVEL](#cmake-android-native-api-level)
+ [ANDROID\_STL](#cmake-android-stl)
+ [ANDROID\_TOOLCHAIN\_NAME](#cmake-android-toolchain-name)
+ [DISABLE\_ANDROID\_STANDALONE\_BUILD](#cmake-disable-android-standalone-build)
+ [NDK\_DIR](#cmake-ndk-dir)

### ANDROID\_ABI
<a name="cmake-android-abi"></a>

仅限 Android。控制要输出哪个应用程序二进制接口（ABI）的代码。

**注意**  
目前并非所有有效的 Android ABI 值都受支持。

值  
 *arm64* \| *armeabi-v7a* \| *x86\_64* \| *x86* \| *mips64* \| *mips* 

默认  
 *armeabi-v7a* 

### ANDROID\_BUILD\_CURL
<a name="cmake-ANDROID_BUILD_CURL"></a>

仅限 Android。如果为 `ON`，还要构建 curl。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### ANDROID\_BUILD\_OPENSSL
<a name="cmake-ANDROID_BUILD_OPENSSL"></a>

仅限 Android。如果为 `ON`，还要构建 Openssl。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### ANDROID\_BUILD\_ZLIB
<a name="cmake-ANDROID_BUILD_ZLIB"></a>

仅限 Android。如果为 `ON`，还将构建 Zlib。

值  
 *ON* \| *OFF* 

默认  
 *ON* 

### 安卓\_原生\_ API\_LEVEL
<a name="cmake-android-native-api-level"></a>

仅限 Android。控制 SDK 针对哪个 API 级别进行构建。如果您将 [ANDROID\_STL](#cmake-android-stl) 设置为 *gnustl*，则可以选择任何 API 级别。如果您使用 *libc\+\+*，则必须使用至少 *21* 级的 API 级别。

默认  
因 STL 选择而异。

### ANDROID\_STL
<a name="cmake-android-stl"></a>

仅限 Android。控制 SDK 使用哪种 C\+\+ 标准库。

**重要**  
如果使用 `gnustl` 选项，SDK 内部可能会出现性能问题；我们强烈建议使用 *libc\+\+\_shared* 或 *libc\+\+\_static*。

值  
 *libc\+\+\_shared* \| *libc\+\+\_static* \| *gnustl\_shared* \| *gnustl\_static* 

默认  
 *libc\+\+\_shared* 

### ANDROID\_TOOLCHAIN\_NAME
<a name="cmake-android-toolchain-name"></a>

仅限 Android。控制使用哪个编译器来构建 SDK。

**注意**  
由于 Android NDK 已弃用 GCC，建议使用默认值。

默认  
 *standalone-clang* 

### DISABLE\_ANDROID\_STANDALONE\_BUILD
<a name="cmake-disable-android-standalone-build"></a>

仅限 Android。默认情况下，Android 版本会使用通过 NDK 脚本构建的基于 Clang 的独立工具链。要使用自己的工具链，请开启此选项**。

值  
 *ON* \| *OFF* 

默认  
 *OFF* 

### NDK\_DIR
<a name="cmake-ndk-dir"></a>

仅限 Android。指定一个替代路径，构建系统应从该路径查找 Android NDK。默认情况下，如果未设置环境变量 `ANDROID_NDK`，则构建系统会检查此变量。