3

我有一堆静态 .lib 文件,包括链接到我的项目的 mysqlclient.lib、v8_base.lib 和 mysqlpp.lib,这些都是使用 Visual Studio 2008 构建的,它们是使用 /MT 运行时库选项构建的。

我刚刚尝试升级到 VS2012 并且代码编译得很好但是当项目被链接时我得到以下错误(总共超过 500 个错误):

Error   47  error LNK2019: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ) referenced in function "public: void __thiscall std::ios_base::clear(int,bool)" (?clear@ios_base@std@@QAEXH_N@Z)  D:\server\mysqlpp.lib(dbdriver.obj) server
Error   48  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(datetime.obj) server
Error   49  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(stadapter.obj)    server
Error   50  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(sqlstream.obj)    server
Error   51  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(connection.obj)   server
Error   52  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(mystring.obj) server
Error   53  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(row.obj)  server
Error   54  error LNK2001: unresolved external symbol "public: __thiscall std::_Mutex::~_Mutex(void)" (??1_Mutex@std@@QAE@XZ)   D:\server\mysqlpp.lib(query.obj)    server
Error   55  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(dbdriver.obj) server
Error   56  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(datetime.obj) server
Error   57  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(stadapter.obj)    server
Error   58  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(sqlstream.obj)    server
Error   59  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(connection.obj)   server
Error   60  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(mystring.obj) server
Error   61  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(row.obj)  server
Error   62  error LNK2001: unresolved external symbol "long const std::_BADOFF" (?_BADOFF@std@@3JB) D:\server\mysqlpp.lib(query.obj)    server
Error   63  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(qparms.obj)   server
Error   64  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(sqlstream.obj)    server
Error   65  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(options.obj)  server
Error   66  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(field_types.obj)  server
Error   67  error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) referenced in function "public: char __thiscall mysqlpp::SQLTypeAdapter::at(unsigned int)const " (?at@SQLTypeAdapter@mysqlpp@@QBEDI@Z)  D:\server\mysqlpp.lib(stadapter.obj)    server
Error   68  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(manip.obj)    server
Error   69  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(null.obj) server
Error   70  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(datetime.obj) server
Error   71  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(type_info.obj)    server
Error   72  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(vallist.obj)  server
Error   73  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(field_names.obj)  server
Error   74  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(query.obj)    server
Error   75  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(dbdriver.obj) server
Error   76  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(tcp_connection.obj)   server
Error   77  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(uds_connection.obj)   server
Error   78  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(connection.obj)   server
Error   79  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(mystring.obj) server
Error   80  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(row.obj)  server
Error   81  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(result.obj)   server
Error   82  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(null.obj) server
Error   83  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(qparms.obj)   server
Error   84  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(sqlstream.obj)    server
Error   85  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(field_types.obj)  server
Error   86  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(stadapter.obj)    server
Error   87  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(manip.obj)    server
Error   88  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(utility.obj)  server
Error   89  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(datetime.obj) server
Error   90  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(type_info.obj)    server
Error   91  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(vallist.obj)  server
Error   92  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(field_names.obj)  server
Error   93  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(query.obj)    server
Error   94  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(dbdriver.obj) server
Error   95  error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) D:\server\mysqlpp.lib(tcp_connection.obj)   server

VS2012 的标准库定义的运行时符号是否与 VS2008 提供的不同?

4

2 回答 2

2

您看到的问题是由于 STL 和作为 C++ 的一部分提供的其他库的差异。您可以尝试以下链接器开关:

/NODEFAULTLIB[:library]

在 VS2008 端构建它时,如果你不能这样做,那么你就不走运了。基本上,您必须做的是摆脱标准库,从而将解析它们的任务委托给稍后使用生成的 static 的链接器.lib

我应该补充一点,您还需要确保只使用收件人库知道的功能。

于 2012-08-22T13:43:35.417 回答
0

MS 有时会更改标准库函数的实现。我只需要解决一个类似的问题,其中 std::_String_base::_Xran () 和 Xlen 的调用约定已从 thiscall 切换到 cdecl。您必须找出不同版本之间发生了什么。然后可以通过包装器来解决这个问题,这些包装器使用所需的调用约定和名称装饰导出函数并重定向到新的实现。

#include <string>

namespace std2008
{
class _String_base_2008
{ 
    public:
        __declspec(dllexport) void _Xlen2008(void) const; 
        __declspec(dllexport) void _Xran2008(void) const; 
};
};

void std2008::_String_base_2008::_Xran2008 () const
{
    std::_String_base::_Xran ();
}

void std2008::_String_base_2008::_Xlen2008 () const
{
    std::_String_base::_Xlen ();
}

将此代码保存为“compat.cpp”并编译

cl /D_DLL_EXPORT /EHsc /LD compat.cpp /link

现在让我们检查已创建的 lib 文件:

dumpbin /exports compat.lib

就我而言,它看起来像这样:

Dump of file compat.lib

File Type: LIBRARY

     Exports

       ordinal    name

                  ?_Xlen2008@_String_base_2008@std2008@@QBEXXZ (public: void __thiscall std2008::_String_base_2008::_Xlen2008(void)const )
                  ?_Xran2008@_String_base_2008@std2008@@QBEXXZ (public: void __thiscall std2008::_String_base_2008::_Xran2008(void)const )

查看有关缺少符号的链接器错误时,您会看到所需的修饰。在您的情况下,它的 "?_Xran@_String_base@std@@SAXXZ" 和 "?_Xlen@_String_base@std@@SAXXZ"

最后一步是告诉链接器创建一个库,该库使用链接器错误中的符号和从 dumpbin 中获取的名称将标准修饰名称映射到另一个名称。

cl /EHsc /LD compat.cpp /link /export:_Xran@_String_base@std@@SAXXZ=?_Xran2008@_String_base_2008@std2008@@QBEXXZ /export:?_Xlen@_String_base@std@@SAXXZ=?_Xlen2008@_String_base_2008@std2008@@QBEXXZ

必须为链接器抱怨的所有功能执行类似的重定向器。

现在将“compat.lib”库作为附加库添加到您的项目中,现在它应该可以成功链接。

于 2016-11-10T13:14:22.243 回答