You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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没有自动处理依赖链,导致符号无法解析。

修复步骤

  1. 利用AWSSDK的CMake目标自动处理依赖
    AWSSDK提供了预定义的CMake目标(如AWSSDK::aws-cpp-sdk-s3),会自动处理所有依赖的子库及链接顺序,无需手动罗列所有AWS库。
  2. 修正RPATH配置
    原配置中-Wl,-rpath,后缺少具体路径,需补充AWS库路径,确保运行时能找到依赖。
  3. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:35:03