如何解决MySQL C++ Connector与OpenSSL的符号重复定义问题?
解决MySQL C++ Connector与OpenSSL符号重复定义(LNK2005)问题
项目同时引入MySQL C++ Connector和用于套接字的OpenSSL库,编译时触发大量LNK2005符号重复定义错误,具体错误信息如下:
1>libcrypto.lib(libcrypto-lib-x509_d2.obj) : error LNK2005: X509_STORE_load_locations already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-ct_policy.obj) : error LNK2005: CT_POLICY_EVAL_CTX_free already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-ct_policy.obj) : error LNK2005: CT_POLICY_EVAL_CTX_set1_cert already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-ct_policy.obj) : error LNK2005: CT_POLICY_EVAL_CTX_set1_issuer already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-ct_policy.obj) : error LNK2005: CT_POLICY_EVAL_CTX_set_shared_CTLOG_STORE already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-ct_policy.obj) : error LNK2005: CT_POLICY_EVAL_CTX_set_time already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_Calc_A already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_Calc_server_key already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_Verify_A_mod_N already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_Verify_B_mod_N already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_check_known_gN_param already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-srp_lib.obj) : error LNK2005: SRP_get_default_gN already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_INFO_free already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_INFO_get0_CERT already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_INFO_get0_NAME already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_INFO_get_type already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_close already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_eof already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_error already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_load already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll) 1>libcrypto.lib(libcrypto-lib-store_lib.obj) : error LNK2005: OSSL_STORE_open already defined in mysqlcppconn-static.lib(libcrypto-1_1-x64.dll)
当前项目配置
包含目录
\asio-1.24.0\include \openssl\Lib\x64\Release\include \MySQL\Connector C++ 8.0\include\jdbc
链接器输入
\openssl\Lib\x64\Release\lib\libcrypto.lib \openssl\Lib\x64\Release\lib\libssl.lib crypt32.lib mysqlcppconn-static.lib
可行解决方案
1. 替换为动态版MySQL Connector库
静态版mysqlcppconn-static.lib确实内置了OpenSSL的符号,换成动态版mysqlcppconn.lib即可,运行时要保证mysqlcppconn.dll在可执行文件路径下。动态版不会把OpenSSL符号打包进去,从根源避免冲突。
2. 调整链接顺序
如果必须使用静态版MySQL库,调整链接器输入的顺序:把mysqlcppconn-static.lib放在libcrypto.lib和libssl.lib的前面。链接器会优先使用先出现的库中的符号,这样就不会触发重复定义报错。
3. 使用无SSL版本的MySQL Connector静态库
部分版本的MySQL C++ Connector提供了不带SSL支持的静态库(命名通常带有-no-ssl后缀),如果你的场景不需要MySQL的SSL连接,可以选择这类库,彻底规避OpenSSL符号冲突。
4. 统一OpenSSL版本
检查MySQL Connector内置的OpenSSL版本和你手动引入的OpenSSL版本是否一致。版本不匹配也会导致符号冲突,可以尝试换成和MySQL内置版本一致的OpenSSL库,或者自行编译MySQL Connector并指定使用你当前的OpenSSL版本。
内容的提问来源于stack exchange,提问作者abdul
相关产品推荐
相关产品推荐

