gpt4 book ai didi

c++ - 使用自定义工具集获取动态 atexit 析构函数链接错误 - eh vector destructor

转载 作者:行者123 更新时间:2023-11-30 02:25:04 25 4
gpt4 key购买 nike

尝试使用 Visual Studio 2015 工具集针对 VS2005 CRT 进行编译时,我遇到了一个奇怪的链接器错误。
相同的代码在任何其他工具集版本(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 中有一个主要的 refactoring in the CRT .
其中一部分是更改实现和 __ehvec_dtor 的签名。
作为mentioned here ,一个简单的解决方案是只添加实际的实现。

最简单的方法是将此代码添加到头文件并将其包含在 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);
}
}

关于c++ - 使用自定义工具集获取动态 atexit 析构函数链接错误 - eh vector destructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com