Visual Studio Name Mangling "YAPEAV" and Mysql connector

Visual Studio Name Mangling "YAPEAV" and Mysql connector

本文关键字:and Mysql connector YAPEAV Visual Name Mangling Studio      更新时间:2023-10-16

将我的代码与 MySQL 连接器C++ 1.1.0 链接时,我遇到了未解决的外部符号错误。
下面是错误消息:

6>database.lib(db_manager.obj) : error LNK2019: unresolved external symbol
"class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)" (?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ)
referenced in function "class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_mysql_driver_instance(void)" (?get_mysql_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ)

我使用 dumpbin 在 mysqlconn-static.lib 中获取符号列表,并找到了一个类似的符号:

COMDAT; sym= "class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)" (?get_driver_instance@mysql@sql@@YAPEAVMySQL_Driver@12@XZ)

当这两行对齐时,差异如下所示:

(?get_driver_instance@mysql@sql@@YAPEAVMySQL_Driver@12@XZ)  
(?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ)  

YAPEAVYAPAV 之间的名称管理有什么区别?

有一个想法,我的问题与MySQL连接器库与我构建代码的方式之间的不兼容性有关。

我在网上搜索并发现了针对MySQL连接器1.1.0的错误,但它被更改为"不是错误"。

我正在使用Visual Studio 2010编译为使用64位平台的32位目标。
MySQL 连接器C++版本为 1.1.0。

MSVC 工具undname是您的朋友。 使用它,你会发现

  • ?get_driver_instance@mysql@sql@@YAPEAVMySQL_Driver@12@XZ对应于:

    class sql::mysql::MySQL_Driver * __ptr64 __cdecl sql::mysql::get_driver_instance(void)
    
  • ?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ对应于:

    class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)
    

区别在于__ptr64装饰。 看起来您正在构建一个 32 位程序,但链接到为 64 位目标构建的库。