尝试编译针对VS2005 CRT与一个Visual Studio 2015年工具集时,我得到一个奇怪的链接错误。
相同的代码编译完美的任何其他工具集版本(2005,2010,2012,2013)。
该代码必须在VS2005 CRT编译正常与其它项目链接。
如何重现:创建一个新的空动态库(DLL)项目(在VS2015,工具集V140),添加源(的.cpp)文件:
//1.cpp
#include <string>
static std::wstring thisWillFail[] = { L"test" };
更改VC ++包含目录和库目录:
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\include
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\include
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\lib
C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\Lib
然后,只需编译,一个你会得到这样的错误:
1>StdAfx.obj : error LNK2019: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,unsigned int,void (__thiscall*)(void *))" (??_M@YGXPAXIIP6EX0@Z@Z) referenced in function "void __cdecl `dynamic atexit destructor for 'fasdfp''(void)" (??__Ffasdfp@@YAXXZ)
如果你设置了图书馆,包括路径到VS2010 CRT和Windows SDK同样会发生。
那么,为什么VS2015生成这些额外的功能? 而最重要的是我如何解决此问题?
上会出现同样的连接错误每次静态成员我有,和一个类似的几类。
在VS2015发生了重大的CRT重构 。
其中一部分被改变的执行,并签名__ehvec_dtor
。
正如这里提到 ,一个简单的解决办法是只添加实际执行。
简单的方法是这个代码在stdafx.h中添加一个头文件并将其包含:
#if defined __cplusplus_cli
#define CALEETYPE __clrcall
#else
#define CALEETYPE __stdcall
#endif
#define __RELIABILITY_CONTRACT
#define SECURITYCRITICAL_ATTRIBUTE
#define ASSERT_UNMANAGED_CODE_ATTRIBUTE
#if defined __cplusplus_cli
#define CALLTYPE __clrcall
#elif defined _M_IX86
#define CALLTYPE __thiscall
#else
#define CALLTYPE __stdcall
#endif
__RELIABILITY_CONTRACT
void CALEETYPE __ArrayUnwind(
void* ptr, // Pointer to array to destruct
size_t size, // Size of each element (including padding)
int count, // Number of elements in the array
void(CALLTYPE *pDtor)(void*) // The destructor to call
);
__RELIABILITY_CONTRACT
inline void CALEETYPE __ehvec_ctor(
void* ptr, // Pointer to array to destruct
size_t size, // Size of each element (including padding)
// int count, // Number of elements in the array
size_t count, // Number of elements in the array
void(CALLTYPE *pCtor)(void*), // Constructor to call
void(CALLTYPE *pDtor)(void*) // Destructor to call should exception be thrown
) {
size_t i = 0; // Count of elements constructed
int success = 0;
__try
{
// Construct the elements of the array
for (; i < count; i++)
{
(*pCtor)(ptr);
ptr = (char*)ptr + size;
}
success = 1;
}
__finally
{
if (!success)
__ArrayUnwind(ptr, size, (int)i, pDtor);
}
}
__RELIABILITY_CONTRACT
SECURITYCRITICAL_ATTRIBUTE
inline void CALEETYPE __ehvec_dtor(
void* ptr, // Pointer to array to destruct
size_t size, // Size of each element (including padding)
// int count, // Number of elements in the array
size_t count, // Number of elements in the array
void(CALLTYPE *pDtor)(void*) // The destructor to call
) {
_Analysis_assume_(count > 0);
int success = 0;
// Advance pointer past end of array
ptr = (char*)ptr + size*count;
__try
{
// Destruct elements
while (count-- > 0)
{
ptr = (char*)ptr - size;
(*pDtor)(ptr);
}
success = 1;
}
__finally
{
if (!success)
__ArrayUnwind(ptr, size, (int)count, pDtor);
}
}
文章来源: Getting dynamic atexit destructor link error with custom toolset - eh vector destructor