4

将我的代码与 MySQL Connector 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)  

YAPEAVAND之间的名称管理有什么区别YAPAV

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

我在网上搜索了一个针对 MySQL Connector 1.1.0 的错误,但它被更改为“不是错误”。

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

4

1 回答 1

3

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 位目标构建的库。

于 2012-11-28T18:09:49.210 回答