C++ 未解析的外部符号链接库时,编译器会添加字母';A';到函数名

C++ 未解析的外部符号链接库时,编译器会添加字母';A';到函数名,c++,compiler-construction,visual-c++,linker,symbols,C++,Compiler Construction,Visual C++,Linker,Symbols,尝试链接win32 exe项目时出现此错误。我已经链接了包含此方法代码的库。但仍然会得到一个未解决的符号错误 错误LNK2001:未解析的外部符号“public:bool\uu thiscall SharedJobQueue::AddJobA(类boost::shared\u ptr)”(?AddJobA@SharedJobQueue@@QAE_NV?$共享_ptr@VJob@域@@@boost@@@Z) 为什么它在结尾处用“A”写AddJobA。该方法被声明为AddJob 我已经查看了'dum

尝试链接win32 exe项目时出现此错误。我已经链接了包含此方法代码的库。但仍然会得到一个未解决的符号错误

错误LNK2001:未解析的外部符号“public:bool\uu thiscall SharedJobQueue::AddJobA(类boost::shared\u ptr)”(?AddJobA@SharedJobQueue@@QAE_NV?$共享_ptr@VJob@域@@@boost@@@Z)

为什么它在结尾处用“A”写AddJobA。该方法被声明为AddJob


我已经查看了'dumpbin/symbols'的输出,它只包含AddJob而不是AddJobA的符号。为什么编译器要在函数名的末尾添加一个“A”?

Windows函数在函数的末尾可能有
A
W
A
表示ASCII,而
W
表示固定大小的unicode。项目设置决定使用哪个功能。如果您的项目启用了unicode,addJob最后可能会有
W

MS使用Win32 API的宏来支持unicode和Ansi版本,方法是在函数名后面加上
A
W


是Win32 API中的一个函数,因此有这样一个宏-您可以
#undef AddJob
来解决您的问题。

这里我们看到了宏的问题

代码本身没有问题,问题在于windows库。实际上在Win32标头中调用了一个函数,但不完全是。。。函数不声明Addjob函数,而是声明AddJobA和AddJobW函数,这两个函数分别处理非unicode和unicode字符串

函数名末尾的
A
是由于windows标头中定义了一个宏,该宏用于处理unicode。基本上,他们会有这样的东西:

#ifdef UNICODE
#  define AddJob AddJobW
#else
#  define AddJob AddJobA
#endif
这允许人们只使用
AddJob
,宏将函数指向正确的unicode/非unicode函数。当然,问题是
#define
会影响所有事情,这就是函数发生的情况


要解决此问题,您可以
#undef AddJob
或简单地将函数名更改为非Win32函数的名称。

是否有Win32标头使用宏“获取”的名称列表?好让我知道我不应该用什么名字。好问题。我不相信有,但我还是没有看。最简单的检查方法是转到msdn.microsoft.com,搜索您想要使用的函数的名称,看看它是否已经在“使用”中。我不会在这里说“宏是个问题”。在整个低级win32 API中,它们一直以固定的方式使用。对于一些完全不相关且隐藏的代码,无意中修改并破坏了代码,没有留下任何关于发生了什么的线索,您看不出有什么问题吗?宏通常没有任何问题,仅与它们的使用方式有关-例如,如果它们像在Win32 API中那样被侵入性使用。