编译TrinityCore遇LNK2019错误:未解析OSSL_PROVIDER_set_default_search_path
错误信息
Error LNK2019 unresolved external symbol OSSL_PROVIDER_set_default_search_path referenced in function "void __cdecl OpenSSLCrypto::threadsCleanup(void)" (?threadsCleanup@OpenSSLCrypto@@YAXXZ) authserver C:\Build\src\server\authserver\common.lib(OpenSSLCrypto.obj) 1
以下是针对该问题的具体排查步骤:
确认OpenSSL版本兼容性
OSSL_PROVIDER_set_default_search_path是OpenSSL 3.0及以上版本新增的API,若使用1.1.x或更早版本,必然会出现符号未解析问题。打开命令行执行openssl version,确认主版本号≥3.0,若版本过低,卸载后重新安装OpenSSL 3.x的Win64发行版。匹配Debug/Release模式的库文件
OpenSSL的Debug与Release版本库文件不同:Debug版为libcryptod.lib、libssld.lib,Release版为libcrypto.lib、libssl.lib。若当前项目编译模式(如Debug)误用了Release库,会导致符号不匹配。进入项目属性→链接器→输入→附加依赖项,根据当前编译模式切换对应库文件。检查库目录的完整性
确认C:\Program Files\OpenSSL-Win64\lib下存在对应模式的库文件,部分OpenSSL版本会将Debug库放在lib/VC/static等子目录中,需将该子目录也添加至附加库目录。设置正确的预处理器定义
在项目属性→C/C++→预处理器→预处理器定义中添加OPENSSL_API_COMPAT=0x30000000L,确保编译器能正确识别OpenSSL 3.x的API,避免因API声明版本不匹配导致链接失败。同步common项目的OpenSSL配置
错误提示中是common.lib中的对象文件引用了该符号,需检查common项目的附加包含目录、库目录、依赖库配置是否与authserver一致,避免common项目使用旧版OpenSSL编译导致符号不兼容。验证库文件中的符号存在性
打开VS开发者命令提示符,执行以下命令检查libcrypto.lib是否包含目标符号:dumpbin /symbols "C:\Program Files\OpenSSL-Win64\lib\libcrypto.lib" | findstr OSSL_PROVIDER_set_default_search_path若输出为空,说明当前libcrypto.lib确实不包含该符号,需重新下载完整的OpenSSL 3.x版本库。
内容的提问来源于stack exchange,提问作者MHogge

