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 上。
我正在使用一个导出 returns 一个 shared_ptr.
函数的 dlldll项目中的代码:
#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 上。