编译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中已被弃用
解决步骤:
- 降级OpenSSL到1.1.1版本:
brew install openssl@1.1 - 更新.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" - 重启终端后重新运行CMake构建。
3. 统一Conan依赖的OpenSSL版本
Conan安装的包(如libcurl)可能引入冲突的OpenSSL版本,需强制指定兼容版本:
- 修改
conanfile.txt:[requires] openssl/1.1.1t libcurl/7.87.0 cpr/1.10.0 boost/1.81.0 nlohmann_json/3.11.2 - 重新生成Conan构建信息:
cd conanBuild && conan install ..
4. 尝试使用系统默认OpenSSL
如果系统默认OpenSSL为1.1.x,可暂时注释掉.zshrc中OpenSSL 3.x的环境变量,让CMake优先识别系统版本。
内容的提问来源于stack exchange,提问作者Sokker
相关产品推荐
相关产品推荐

