使用cmake配置aws-cpp-sdk以及在cmake项目中使用

本文详细介绍了如何使用CMake在Windows上配置和编译AWS SDK for C++,包括设置编译选项、解决找不到头文件的错误、CMake找不到包的问题以及解决MSVC链接错误。同时,还提到了cJson冲突和UNICODE宏冲突的解决方案,确保项目能够成功构建并运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • clion
  • msvc 15(2017)
  • cmake

配置cmake

这里不多赘述

编译aws-cpp-sdk

1.使用git bash下载aws-cpp-sdk项目到指定目录

注意命令里一定要加–recurse-submodules参数,否则编译的时候会提示项目找不到子项目

git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp

2. 使用clion打开项目

3. 设置cmake编译选项

在这里插入图片描述
先设置build directory为build,然后设置cmake options

-DBUILD_ONLY="s3;..."
-DCMAKE_INSTALL_PREFIX="D:\ProgramData\aws-sdk-cpp\build\install"
  • BUILD_ONLY:设置要编译的模块,多个模块之间用";"分隔
  • CMAKE_INSTALL_PREFIX:cmake的下载路径,完成安装之后使用find_package才能找到。

4. BUILD&&INSTALL 项目

对应 cmake --build && cmake --install

选择Build>Install完成项目的构建和安装,这个选项实际是将build和install合并成一步。
注意:一定要使用Install选项,才会在CMAKE_INSTALL_PREFIX指定的目录输出动态链接库,lib文件,include头文件等内容,才能在之后的cmake项目中使用find_package找到包。
在这里插入图片描述

在cmake项目中使用aws-cpp-sdk

配置CMakeLists.txt


#设置AWSSDK_DIR,然后find_package
#$ENV{AWSSDK_HOME}表示取环境变量中的AWSSDK_HOME
#实际就是"<项目所在路径>\aws-sdk-cpp\build"目录,
#“build”对应之前的之前设置的build directory
set(AWSSDK_DIR $ENV{AWSSDK_HOME})
# aws-cpp-sdk的组件很多
# COMPONENTS后面可以指定想要使用的组件
find_package(AWSSDK REQUIRED COMPONENTS s3)

# 使用msvc需要添加下面两个编译选项
if (MSVC)
    add_definitions(-DUSE_IMPORT_EXPORT)
    add_definitions(-DUSE_WINDOWS_DLL_SEMANTICS)
endif ()

add_executable(test_program main.cpp)
target_link_libraries(test_program ${AWSSDK_LINK_LIBRARIES})

编译和项目构建中坑

fatal error C1083: Cannot open include file: ‘unistd.h’

【解决方案】

建议使用git clone下载项目,一定要添加–recurse-submodules选项

git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp

find_package(AWSSDK REQUIRED)找不到

【错误描述】

CMake Error at CMakeLists.txt:12 (find_package):
  By not providing "FindAWSSDK.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "AWSSDK", but
  CMake did not find one.

  Could not find a package configuration file provided by "AWSSDK" with any
  of the following names:

    AWSSDKConfig.cmake
    awssdk-config.cmake

  Add the installation prefix of "AWSSDK" to CMAKE_PREFIX_PATH or set
  "AWSSDK_DIR" to a directory containing one of the above files.  If "AWSSDK"
  provides a separate development package or SDK, be sure it has been
  installed.

【解决方案】

确认一下

  • 有没有设置CMAKE_INSTALL_PREFIX
  • 有没有install项目(对应cmake --install,linux下应该是make&&make install??)
  • 项目的CMakeList.txt的AWSSDK_DIR有没有设置对,应该设置为cmake --build生成的目录。

error LNK2001: unresolved external symbol “char const * const Aws::Http::CONTENT_TYPE_HEADER”

【错误描述】

error LNK2001: unresolved external symbol "char const * const Aws::Http::CONTENT_TYPE_HEADER" (?CONTENT_TYPE_HEADER@Http@Aws@@3QBDB) Aws::Http::API_VERSION_HEADER" (?API_VERSION_HEADER@Http@Aws@@3QBDB)

【解决方法】

msvc下需要添加下面两个编译选项,官方文档下的Build Defines有提到。

if (MSVC)
    add_definitions(-DUSE_IMPORT_EXPORT)
    add_definitions(-DUSE_WINDOWS_DLL_SEMANTICS)
endif ()

使用中的坑

cJson冲突

aws-cpp-sdk-core中自带cJson文件,会和外部引入的cJson项目发生冲突。
解决方案可能就直接使用aws-cpp-sdk-core里面的cJson吧,如果有其他好办法可以在下面留言😂。

#include "aws/core/external/cjson/cJSON.h"

Support of UNICODE macro on Windows Visual Studio Projects

【错误描述】

github 上的一个issue,当然我自己也遇到了,简单来说就是S3Client里的方法名称和window下的wingdi.h文件冲突了。

【解决方案】

首先建议在.cpp文件中才使用冲突的方法,防止预处理命令污染其他文件
然后直接取消宏定义😂,可以自己加一点分支判定哈。

#undef GetObject
#undef GetMessage
### 如何在 Linux 上编译安装 AWS SDK for C++ #### 准备工作 为了成功编译和安装AWS SDK for C++,需要先确保开发环境已经配置好必要的依赖库。对于基于Red Hat的系统,可以使用如下命令来安装所需的开发工具和库: ```bash yum install -y openssl-devel ``` 此操作能够确保OpenSSL库及其头文件被正确安装到系统中[^1]。 #### 下载源码包 前往[AWS官方GitHub仓库](https://github.com/aws/aws-sdk-cpp),获取最新版本的SDK源代码压缩包。解压后得到的是完整的源代码树结构。 #### 创建并进入构建目录 为了避免污染原始源代码,在根目录之外新建一个专门用于编译过程的工作空间是非常重要的做法之一。通过执行下面两条指令完成这一步骤: ```bash mkdir sdk_build cd sdk_build ``` 这样做不仅有助于维护清晰有序的项目布局,同时也便于后续清理不必要的中间产物[^2]。 #### 配置CMake选项 接下来利用CMake工具来进行项目的初始化设置。这里推荐采用Debug模式以便于调试期间更好地理解程序行为;当然如果追求性能则可切换至Release模式。具体来说就是运行这条命令: ```bash cmake ../aws-DCMAKE_BUILD_TYPE=debug ``` 上述命令指定了相对路径指向父级目录下的`aws-sdk-cpp`作为源代码位置,并设置了构建类型为调试版。 #### 执行编译流程 根据实际需求决定是要编译整个SDK还是仅限某些特定的服务接口。全量编译可以通过简单的`make`调用来实现;而针对个别组件,则需指定相应的子目录名称加上额外参数控制并发作业数(`-j`)以及当前所在路径(`-C`): ```bash # 完整编译 make # 或者只编译核心功能与S3服务端口 make -j $(nproc) -C aws-cpp-sdk-core make -j $(nproc) -C aws-cpp-sdk-s3 ``` 这里的`$(nproc)`宏会自动检测CPU逻辑处理器数量从而最大化利用多核优势加快速度[^3]。 #### 进行安装部署 最后一步便是把生成的目标文件复制到系统的标准库路径下使得其他应用程序可以直接链接使用这些动态/静态库。同样支持全局范围内的全面铺开或是局部范围内按需分发两种方式: ```bash sudo make install # 或者分别处理各个模块 sudo make install -C aws-cpp-sdk-core sudo make install -C aws-cpp-sdk-s3 ``` 值得注意的是当尝试一次性打包所有特性时可能会遇到因硬件资源限制而导致失败的情况(比如EC2实例),因此建议至少配备有16GB RAM以上的机器来承担这项任务。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

虹幺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值