YAXPBD与YAXPEBD的区别及ODAC 18.03安装失败问题咨询
问题解答
一、YAXPBD 和 YAXPEBD 到底差在哪?
这俩其实是微软VC编译器对C函数做**名字改编(Name Mangling)**后的产物,核心差异就在参数类型的编码上:
- 先说
YAXPBD:这里的PBD拆解开是P(Pointer,指针)+B(char,字符类型)+D(const,常量修饰),合起来就是函数参数是const char*(指向常量字符的指针)。 - 再看
YAXPEBD:多出来的那个E代表额外的指针层级,准确来说PEBD对应的是const char* const*(指向“指向常量字符的指针”的常量指针)。简单说就是参数从一级指针变成了二级指针,这直接导致两个函数签名完全不兼容。
二、ODAC安装报错的原因分析
你遇到的这个问题,本质是CRT(C运行时库)版本不兼容,咱们一步步拆解:
- 函数签名不匹配的根源:
你看到的导入函数和导出函数名字差了个E,说明ODAC安装程序编译时依赖的VC++ CRT版本,和你现在装的VC++ Redist 12.0.30501.0版本,在std::_Xlength_error这个函数的定义上不一样。这种差异通常和编译器的编译选项(比如你提到的/MT)以及CRT的更新补丁有关。 - 和
/MT选项的关联:/MT是VC++的编译选项,意思是多线程静态链接CRT——正常来说用这个选项编译的程序,会把CRT代码直接打包进程序里,不该依赖系统里的MSVCR120.dll才对。但报错说明安装程序可能混着用了静态和动态CRT的编译选项,或者部分模块还是依赖动态CRT,结果就出现了签名不匹配的问题。 - 为什么Dependency Walker显示存在却用不了?
系统里的MSVCR120.dll确实在,但它导出的_Xlength_error函数签名和安装程序需要的对不上。大概率是因为:- ODAC安装程序是用带特定补丁的VC++ 12.0(也就是VS2013)编译的,而你装的VC++ Redist是基础版本,没打那个补丁;
- 或者你的Redist版本太老,和安装程序依赖的CRT版本不匹配。
给你的解决建议
- 先试试把当前的VC++ Redist 12.0.30501.0卸载,安装VC++ Redist 12.0的最新补丁版本(比如12.0.40664.0或者更高);
- 检查一下你下载的ODAC版本是不是对应正确的VC++ Redist版本,比如有没有针对VS2013补丁的ODAC安装包;
- 另外,确认系统的System32和SysWOW64目录里有没有多个版本的MSVCR120.dll,避免版本冲突。
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

