尝试链接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”?
答案 0 :(得分:5)
MS使用Win32 API的宏通过使用A
或W
后缀函数名来支持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函数在函数末尾可能有A
或W
- A
表示ASCII,W
表示宽固定大小的unicode。您的项目设置确定使用哪个功能。如果为项目启用了unicode,addJob最后可能会有W
。