【问题标题】:LINK2019: unresolved external symbol for a function returning shared_ptr<int>LINK2019:返回 shared_ptr<int> 的函数的未解析外部符号
【发布时间】:2017-11-22 10:44:58
【问题描述】:

我正在使用一个 dll 导出一个返回 shared_ptr 的函数。

来自 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 Studio 2013 工具集 编译的,而使用 dll 的项目是使用 Visual Studio 2010 工具集

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

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

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

【问题讨论】:

    标签: c++ visual-studio-2010 dll visual-studio-2013 shared-ptr


    【解决方案1】:

    简答:

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

    长答案:

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

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

    Some more info 在 StackOverflow 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2013-11-03
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多