LNK2019:函数返回 shared_ptr<int> 的未解析外部符号

LINK2019: unresolved external symbol for a function returning shared_ptr<int>

我正在使用一个导出 returns 一个 shared_ptr.

函数的 dll

dll项目中的代码:

#ifdef _WRAPPER
    #define WRAPPER_DLL_EXT __declspec(dllexport)
#else
    #define WRAPPER_DLL_EXT __declspec(dllimport)
#endif


std::shared_ptr<int> WRAPPER_DLL_EXT func()
{
    return std::make_shared<int>(5);
}

使用 dll 的项目代码:

std::shared_ptr<int> myPointer = func();

我收到 func() 的错误 LINK2019: unresolved external symbol

dll项目是使用Visual Studio2013 Toolset编译的,而使用dll的项目是使用Visual Studio2010 Toolset.

使用 VS2010 工具集编译 dll 可以防止错误,但我在实现中使用 VS2013 功能,因此我无法实际使用 VS2010 编译 dll。 请注意,我无法将正在使用的项目升级到 VS2013。

对于使用 dll 的项目,我怎样才能使用 VS2013 工具集使其工作?

编辑:如果我将 shared_ptr 更改为 unique_ptr,它会起作用(但是,当然,这不是我需要的)。

简答:

为您的 dll 使用纯 C API 对 DLL 和可执行文件使用相同的工具集版本

长答案:

C++ 在不同的编译器版本之间 ABI 不兼容。这意味着不同版本的工具集不会生成兼容的二进制文件。 C++ 名称可以被不同地破坏,内存布局不同等等——这将导致链接器无法找到正确的函数,或者一些可怕的运行时错误。确保东西与 ABI 兼容的唯一方法是使用一种保证在工具集版本之间是 ABI 稳定的语言,那就是 C。

这基本上就是为什么通过 DLL 公开的 Windows API 是具有普通 C 结构和内容的 C 函数的原因。

Some more info 在 Whosebug 上。