链接lib时未解析的外部符号,编译器会在函数名称中添加字母“A”

时间:2010-02-23 11:01:03

标签: c++ compiler-construction visual-c++ linker symbols

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

error LNK2001: unresolved external symbol "public: bool __thiscall SharedJobQueue::AddJobA(class boost::shared_ptr<class domain::Job>)" (?AddJobA@SharedJobQueue@@QAE_NV?$shared_ptr@VJob@domain@@@boost@@@Z)

为什么在结尾处使用'A'表示AddJobA。该方法声明为AddJob。

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

3 个答案:

答案 0 :(得分:5)

MS使用Win32 API的宏通过使用AW后缀函数名来支持Unicode和Ansi构建。
AddJob()是Win32 API中的一个函数,因此具有这样的宏 - 您可以#undef AddJob来解决您的问题。

答案 1 :(得分:4)

在这里我们看到了宏的问题。

您的代码本身没有任何问题,问题出在Windows库中。在Win32标头中实际上有一个名为AddJob的函数,但不完全......不要声明一个Addjob函数,而是一个AddJobA和一个AddJobW函数,分别处理非unicode和unicode字符串

函数名末尾的A是由定义为处理unicode的windows标头中定义的宏引起的。基本上他们会有类似的东西:

#ifdef UNICODE
#  define AddJob AddJobW
#else
#  define AddJob AddJobA
#endif

这允许人们只使用AddJob,宏会将函数指向正确的unicode / non-unodeode函数。问题当然是#define影响了一切,这正是你的功能所发生的。

要解决此问题,您可以#undef AddJob或只是将函数名称更改为不是Win32函数的函数。

答案 2 :(得分:1)

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