Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从VS2012项目链接使用VS2008构建的静态库?它们兼容吗?_C++_Visual Studio_Linker_Visual Studio 2012 - Fatal编程技术网

C++ 从VS2012项目链接使用VS2008构建的静态库?它们兼容吗?

C++ 从VS2012项目链接使用VS2008构建的静态库?它们兼容吗?,c++,visual-studio,linker,visual-studio-2012,C++,Visual Studio,Linker,Visual Studio 2012,我有一堆静态的.lib文件,包括mysqlclient.lib、v8_base.lib和mysqlpp.lib,我将它们链接到我的项目中,这些文件都是使用Visual Studio 2008构建的,它们是使用/MT运行时库选项构建的 我刚刚尝试升级到VS2012,代码编译得很好,但当项目链接时,我收到以下错误(总共超过500个错误): VS2012标准库定义的运行时符号与VS2008?> P >不同。您所看到的问题是由于STL和作为C++的一部分的其他库的差异。您可以尝试以下链接器开关: /NO

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

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


VS2012标准库定义的运行时符号与VS2008?

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

/NODEFAULTLIB[:library]
当在VS2008上构建它时,如果你不能做到这一点,那么你就不走运了。基本上,您需要做的是摆脱标准库,从而将解析它们的任务委托给链接器,该链接器稍后将使用生成的静态
.lib


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

MS有时会更改标准库函数的实现。我刚刚修复了一个类似的问题,其中std::\u String\u base::\u Xran()和Xlen的调用约定已从这个调用切换到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 ();
}
现在让我们检查已创建的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”库作为附加库添加到项目中,然后 现在它应该链接成功了

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 )
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