Qt CMake项目链接Amazon AWS SDK时遇BN_num_bits符号未定义错误
链接AWS SDK与OpenSSL时出现undefined reference错误
我将Amazon AWS SDK安装在/home/X/AWS/{lib include}路径下,使用的OpenSSL版本为OpenSSL 1.1.1f 31 Mar 2020。在Qt中创建基于CMake的项目时,无法通过链接阶段,报错undefined reference to symbol 'BN_num_bits@@OPENSSL_1_1_0',具体错误信息如下:
/usr/bin/ld: /home/X/AWS/usr/local/lib/libs2n.a(s2n_dhe.c.o): undefined reference to symbol 'BN_num_bits@@OPENSSL_1_1_0' /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libcrypto.so: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
当前CMake配置如下:
cmake_minimum_required(VERSION 3.14) project(aws_example LANGUAGES CXX) set(BIN_NAME aws_example) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(aws_example main.cpp ) ############################################################################### set(AWSP "/home/X/AWS/usr/local") SET(CMAKE_PREFIX_PATH "/home/X/AWS/usr/local/lib/cmake" ) set_target_properties(${BIN_NAME} PROPERTIES LINK_FLAGS "-Wl,-rpath, -L/home/X/AWS/usr/local/lib") ############################################################################### list(APPEND CMAKE_MODULE_PATH "${AWSP}/lib/cmake") list(APPEND CMAKE_MODULE_PATH "${AWSP}/lib/cmake/AWSSD") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-crt-cpp/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-http/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/s2n/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-common/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-cal/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-compression/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-mqtt/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-auth/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-sdkutils/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-event-stream/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-checksums/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/aws-c-s3/cmake") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/cmake/aws-cpp-sdk-s3") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/cmake/aws-cpp-sdk-core") list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/pkgconfig/aws-cpp-sdk-core") set(aws-sdk-cpp_DIR ${CMAKE_PREFIX_PATH}) #find_package(aws-sdk-cpp) find_package(AWSSDK REQUIRED COMPONENTS s3) ############################################################################### find_package(PkgConfig REQUIRED) pkg_search_module(OPENSSL REQUIRED openssl) if( OPENSSL_FOUND ) include_directories(${OPENSSL_INCLUDE_DIRS}) message(STATUS ">>>>>>>Using OpenSSL ${OPENSSL_VERSION}") message(STATUS ">>>>>>>OpenSSL Folders ${OPENSSL_INCLUDE_DIRS}") endif() message(STATUS ">>>>>>>OpenSSL LIBS ${OPENSSL_LIBRARIES}") target_link_libraries(aws_example ${OPENSSL_LIBRARIES} -ldl -lpthread -lcurl -lz -L${AWSP}/lib -laws-c-cal -laws-c-http -laws-c-s3 -laws-c-sdkutils -laws-c-mqtt -laws-crt-cpp -laws-checksums -laws-c-compression -laws-c-auth -laws-c-event-stream -laws-c-io -laws-c-common -ls2n)
已尝试调整链接顺序,错误数量在200个到当前1个之间变化,将链接项移至底部会出现约200个错误。
解决方案
问题核心
报错DSO missing from command line说明链接器找不到依赖的动态共享对象,这里是libcrypto.so中的BN_num_bits符号。手动指定大量AWS库时,链接顺序错误(依赖OpenSSL的s2n库放在了OpenSSL之后),且CMake没有自动处理依赖链,导致符号无法解析。
修复步骤
- 利用AWSSDK的CMake目标自动处理依赖
AWSSDK提供了预定义的CMake目标(如AWSSDK::aws-cpp-sdk-s3),会自动处理所有依赖的子库及链接顺序,无需手动罗列所有AWS库。 - 修正RPATH配置
原配置中-Wl,-rpath,后缺少具体路径,需补充AWS库路径,确保运行时能找到依赖。 - 调整OpenSSL库的链接位置
将OpenSSL库放在所有依赖它的库之后,确保链接器能正确解析符号。
修改后的CMake配置
cmake_minimum_required(VERSION 3.14) project(aws_example LANGUAGES CXX) set(BIN_NAME aws_example) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(aws_example main.cpp ) ############################################################################### set(AWSP "/home/X/AWS/usr/local") # 合并CMAKE_PREFIX_PATH,简化配置 list(APPEND CMAKE_PREFIX_PATH "${AWSP}/lib/cmake" "${AWSP}/lib/aws-crt-cpp/cmake" "${AWSP}/lib/aws-c-http/cmake" "${AWSP}/lib/s2n/cmake" "${AWSP}/lib/aws-c-common/cmake" "${AWSP}/lib/aws-c-cal/cmake" "${AWSP}/lib/aws-c-compression/cmake" "${AWSP}/lib/aws-c-mqtt/cmake" "${AWSP}/lib/aws-c-auth/cmake" "${AWSP}/lib/aws-c-sdkutils/cmake" "${AWSP}/lib/aws-c-event-stream/cmake" "${AWSP}/lib/aws-checksums/cmake" "${AWSP}/lib/aws-c-s3/cmake" "${AWSP}/lib/cmake/aws-cpp-sdk-s3" "${AWSP}/lib/cmake/aws-cpp-sdk-core" ) set(aws-sdk-cpp_DIR ${CMAKE_PREFIX_PATH}) # 正确设置RPATH,确保运行时找到AWS库 set_target_properties(${BIN_NAME} PROPERTIES LINK_FLAGS "-Wl,-rpath,${AWSP}/lib" INSTALL_RPATH "${AWSP}/lib" ) ############################################################################### find_package(AWSSDK REQUIRED COMPONENTS s3) ############################################################################### find_package(PkgConfig REQUIRED) pkg_search_module(OPENSSL REQUIRED openssl) if( OPENSSL_FOUND ) include_directories(${OPENSSL_INCLUDE_DIRS}) message(STATUS ">>>>>>>Using OpenSSL ${OPENSSL_VERSION}") message(STATUS ">>>>>>>OpenSSL Folders ${OPENSSL_INCLUDE_DIRS}") endif() message(STATUS ">>>>>>>OpenSSL LIBS ${OPENSSL_LIBRARIES}") # 使用AWSSDK预定义目标自动处理依赖,OpenSSL库放在最后 target_link_libraries(aws_example PRIVATE AWSSDK::aws-cpp-sdk-s3 ${OPENSSL_LIBRARIES} -ldl -lpthread -lcurl -lz )
额外说明
- 若
pkg_search_module未正确获取OpenSSL库,可手动指定set(OPENSSL_LIBRARIES crypto ssl)。 - 若仍有问题,可在
LINK_FLAGS中添加-v(如-Wl,-rpath,${AWSP}/lib -v),查看链接器详细输出,确认是否正确加载了OpenSSL库。
内容的提问来源于stack exchange,提问作者COMarius
相关产品推荐
相关产品推荐

