CMake构建依赖Tink与AWS C++ SDK的库时遇AWS::Crypto未找到错误
解决依赖Google Tink与AWS C++ SDK时的CMake链接错误
问题详情
构建依赖Google Tink库和AWS C++ SDK的库时,触发如下CMake错误:
Target "tcc-tink" links to target "AWS::Crypto" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing
尝试过的操作均无效:
- 发现AWS自带的CMake文件支持
crypto和AWS::crypto目标,但该文件仅用于AWS内部构建 - 复制该文件并重命名为
FindAWScrypto.cmake放到AWS C++ SDK源码目录,无效果 - 在自身CMakeLists.txt和上述crypto文件中尝试组合使用
find_target()和add_library(),未解决问题 - 尝试将
AWS::Crypto映射到crypto,但失败,且不清楚该引用的来源
解决方案
1. 手动创建AWS::Crypto别名映射
AWS::Crypto是AWS SDK内部对系统加密库(通常是OpenSSL)的封装别名。如果SDK配置未正确导入该目标,可以手动将其映射到系统已有的加密库目标。在find_package(AWSSDK)之后添加以下代码:
find_package(OpenSSL REQUIRED) # 若OpenSSL::Crypto存在但AWS::Crypto不存在,创建别名 if(TARGET OpenSSL::Crypto AND NOT TARGET AWS::Crypto) add_library(AWS::Crypto ALIAS OpenSSL::Crypto) endif()
2. 修复tink-kms的依赖链接
tink-kms的源文件(如aws_crypto.cc)可能间接依赖加密库,需要确保它正确链接相关依赖:
target_link_libraries(tink-kms PRIVATE tink::static ${AWSSDK_LINK_LIBRARIES} OpenSSL::Crypto)
修改后的完整CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(tcc-tink CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_subdirectory(tink) find_package(AWSSDK REQUIRED COMPONENTS kms) find_package(OpenSSL REQUIRED) # 映射AWS::Crypto到OpenSSL::Crypto if(TARGET OpenSSL::Crypto AND NOT TARGET AWS::Crypto) add_library(AWS::Crypto ALIAS OpenSSL::Crypto) endif() add_library(tink-kms STATIC tink/cc/integration/awskms/aws_crypto.cc tink/cc/integration/awskms/aws_kms_aead.cc) target_include_directories(tink-kms PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/tink/__include_alias" "${CMAKE_CURRENT_BINARY_DIR}/tink/__third_party/com_google_absl/src" "${CMAKE_CURRENT_BINARY_DIR}/tink/__third_party/boringssl/src/src/include" ) target_link_libraries(tink-kms PRIVATE tink::static ${AWSSDK_LINK_LIBRARIES} OpenSSL::Crypto) add_library(tcc-tink SHARED tcc_tink.cpp aws_kms_client.cpp dummy_kms_client.cpp) target_link_libraries(tcc-tink PUBLIC tink::static aws-cpp-sdk-kms tink-kms)
原理说明
- AWS SDK内部用
AWS::Crypto统一指代系统加密库,当SDK的CMake配置未被正确加载时,这个目标会缺失 - 通过手动创建别名,将
AWS::Crypto映射到系统已有的OpenSSL::Crypto目标,就能解决链接时的目标未找到问题 - 同时确保tink-kms链接加密库,避免间接依赖导致的问题
内容的提问来源于stack exchange,提问作者John R Ramsden
相关产品推荐
相关产品推荐

