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

编译mysql-connector-c++示例时链接器无法关联OpenSSL符号

问题

构建基于mysql-connector-c++ 1.1.13的应用程序时,链接器无法找到OpenSSL相关符号,报错如下:

Undefined symbols for architecture x86_64:
  "_EVP_CIPHER_block_size", referenced from:
      my_aes_get_size(unsigned int, my_aes_opmode) in libmysqlcppconn-static.a(my_aes_openssl.cc.o)
  "_EVP_CIPHER_iv_length", referenced from:
      my_aes_encrypt(unsigned char const*, unsigned int, unsigned char*, unsigned char const*, unsigned int, my_aes_opmode, unsigned char const*, bool) in libmysqlcppconn-static.a(my_aes_openssl.cc.o)
      my_aes_decrypt(unsigned char const*, unsigned int, unsigned char*, unsigned char const*, unsigned int, my_aes_opmode, unsigned char const*, bool) in libmysqlcppconn-static.a(my_aes_openssl.cc.o)
      my_aes_needs_iv(my_aes_opmode) in libmysqlcppconn-static.a(my_aes_openssl.cc.o)
  "_FIPS_mode", referenced from:
      set_fips_mode(unsigned int, char*) in libmysqlcppconn-static.a(viosslfactories.cc.o)
      get_fips_mode() in libmysqlcppconn-static.a(viosslfactories.cc.o)
  "_FIPS_mode_set", referenced from:
      set_fips_mode(unsigned int, char*) in libmysqlcppconn-static.a(viosslfactories.cc.o)
  "_SSL_get_peer_certificate", referenced from:
      ssl_verify_server_cert(Vio*, char const*, char const**) in libmysqlcppconn-static.a(client.cc.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

当前CMakeLists.txt配置:

cmake_minimum_required(VERSION 3.24)

set(PROJECT_NAME "ChatBot")
set(CMAKE_CXX_STANDARD 17)
set(PROJECT_PATH /myPath)

project(${PROJECT_NAME})

if(EXISTS ${CMAKE_BINARY_DIR}/conanBuild/conanbuildinfo.cmake)
    include(${CMAKE_BINARY_DIR}/conanBuild/conanbuildinfo.cmake)
    conan_basic_setup()
else()
    message(WARNING "The file conanbuildinfo.cmake doesn't exist, you have to run ./build.sh first")
endif()

include_directories(
    ${PROJECT_PATH}/mysql-connector/include
    ${PROJECT_PATH}/mysql-connector/include/cppconn
)

link_directories(mysql-connector/lib)

add_library(libmysqlcppconn STATIC IMPORTED)
set_property(TARGET libmysqlcppconn PROPERTY IMPORTED_LOCATION ${PROJECT_PATH}/mysql-connector/lib/libmysqlcppconn-static.a)

FILE(GLOB_RECURSE SOURCE_FILES src/*.cpp src/*.h)
add_executable(${PROJECT_NAME} ${SOURCE_FILES} main.cpp)

find_package(OpenSSL REQUIRED)
target_link_libraries(${PROJECT_NAME}
        libmysqlcppconn
        OpenSSL::SSL
        OpenSSL::Crypto
        ${CONAN_LIBS}
)

环境信息:

openssl@3: stable 3.1.0 [keg-only] (via homebrew)
   - keg only so I added 
           export PATH="/usr/local/opt/openssl@3/bin:$PATH"
           export LDFLAGS="-L/usr/local/opt/openssl@3/lib"
           export CPPFLAGS="-I/usr/local/opt/openssl@3/include"
     to my .zshrc as homebrew suggested this

cmake: stable 3.26.0
mysql-connector-c++ 1.1.13
Additional packages installed by conan:
    libcurl/7.87.0
    cpr/1.10.0
    boost/1.81.0
    nlohmann_json/3.11.2

OSX Ventura 13.1
解决方案

1. 调整链接库顺序

链接器按顺序解析符号,需将依赖库(OpenSSL)放在被依赖库(mysql连接器)之前,修改target_link_libraries:

target_link_libraries(${PROJECT_NAME}
        OpenSSL::SSL
        OpenSSL::Crypto
        libmysqlcppconn
        ${CONAN_LIBS}
)

2. 解决版本兼容性问题

mysql-connector-c++ 1.1.13发布于2019年,与OpenSSL 3.x存在API不兼容:

  • OpenSSL 3.x重命名/隐藏了部分旧API(如EVP_CIPHER_block_size改为EVP_CIPHER_get_block_size)
  • FIPS_mode系列函数在3.x中已被弃用

解决步骤:

  1. 降级OpenSSL到1.1.1版本:
    brew install openssl@1.1
    
  2. 更新.zshrc中的环境变量:
    export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
    export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
    export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
    export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"
    
  3. 重启终端后重新运行CMake构建。

3. 统一Conan依赖的OpenSSL版本

Conan安装的包(如libcurl)可能引入冲突的OpenSSL版本,需强制指定兼容版本:

  1. 修改conanfile.txt:
    [requires]
    openssl/1.1.1t
    libcurl/7.87.0
    cpr/1.10.0
    boost/1.81.0
    nlohmann_json/3.11.2
    
  2. 重新生成Conan构建信息:
    cd conanBuild && conan install ..
    

4. 尝试使用系统默认OpenSSL

如果系统默认OpenSSL为1.1.x,可暂时注释掉.zshrc中OpenSSL 3.x的环境变量,让CMake优先识别系统版本。

内容的提问来源于stack exchange,提问作者Sokker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:37:49