我需要在具有四种配置“Debug、RelWithDebInfo、MinSizeRel 和 Release”的项目中使用 AWS SDK
如果我按照说明从源代码构建和安装 SDK,似乎一次只能安装一种配置。 文档说:
通过运行 cmake 生成构建文件。在 cmake 命令行上指定是否构建调试版本或发布版本。在整个过程中选择“调试”以运行应用程序代码的调试配置。在整个过程中选择“发布”以运行应用程序代码的发布配置。
在我需要运行应用程序代码的调试和发布配置的情况下,预期用途是什么?我的项目目前正在开发中,我经常在调试和发布配置之间切换。这似乎是一个常见的用例,但我在设置此设置时遇到了一些困难。
如果我只是使用 sdk 的发布配置,那么当我尝试在调试中构建我的项目时,我会得到:
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in AWSTest3.hello-world.obj
如果我使用调试 SDK,当我尝试在发布版本中构建我的项目时,我会得到相反的结果。这一切都是有道理的,也是我在这种情况下所期望的。
我尝试在单独的目录中安装发布版本和调试版本,但在我的项目的 cmakelists.txt 中链接它们是一个挑战。
当我放入cmakelists.txt时:
find_package(AWSSDK)
find_package(AWSSDKdebug)
Cmake 找到第一个并跳过第二个。事实证明,这是因为当它在建议的文件夹中找到包时,它所做的下一步就是在该文件夹中运行 AWSSDKconfig.cmake。该文件所做的第一件事是:
if(AWSSDK_FOUND)
return()
endif()
当第二个包到达该行时,该行将立即退出。 因此很明显,他们不希望您有两个独立的 SDK 安装并独立链接到每个 SDK。
如果我在第二个库中注释掉该条件,它将找到这两个包。下一步是将它们链接起来。
AWS 建议链接到:
target_link_libraries(${PROJECT_NAME} PUBLIC ${AWSSDK_LINK_LIBRARIES})
${AWSSDK_LINK_LIBRARIES} 是在 AWSSDKconfig.cmake 中设置的变量。尽管每当我尝试打印它时它看起来都是空的。看来我需要链接类似的东西:
find_package(AWSSDK)
target_link_libraries(${PROJECT_NAME} PUBLIC optimized ${AWSSDK_LINK_LIBRARIES})
find_package(AWSSDKdebug)
target_link_libraries(${PROJECT_NAME} PUBLIC debug ${AWSSDK_LINK_LIBRARIES})
当我使用上面的代码时,我得到:
CMake Error at source/projects/AWSTest3.hello-world/CMakeLists.txt:59 (target_link_libraries):
The "optimized" argument must be followed by a library.
如果我保留“优化”或“调试”,那么所有链接都很好。但这些说明符的功能正是我所需要的。
我尝试以不同的方式破解 AWSSDKconfig.cmake 以强制其工作,但我朝这个方向走得越远,就越清楚,这不是正确的方法。
如有任何意见,我们将不胜感激。谢谢!
您应该能够通过在单独的目录中构建和安装来完成此操作。您可以在构建 sdk 时使用以下 cmake 参数来完成此操作:
-DCMAKE_INSTALL_PREFIX="<path-to-install>"
然后在构建应用程序时使用以下内容:
-DCMAKE_PREFIX_PATH="<path-of-install-folder>"
总体来说可能看起来像这样
git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
# debug install
mkdir build-debug
cd build-debug
cmake ../aws-sdk-cpp -DBUILD_ONLY="s3;s3-crt" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="<path-to-debug-install>/debug-install"
cmake --build . --config=Debug
cmake --install . --config=Debug
cd ..
# release install
mkdir build-release
cd build-release
cmake ../aws-sdk-cpp -DBUILD_ONLY="s3;s3-crt" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="<path-to-release-install>/release-install"
cmake --build . --config=Release
cmake --install . --config=Release
cd ..
# building your application in release
cd <your build dir>
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="/<path-to-release-install>/release-install"
cmake --build . --config Release