C ++程序中的TCHAR和未解析的外部符号(LNK2019)错误?

时间:2012-09-16 11:15:22

标签: c++ winapi lnk2019 tchar

我的项目有两个cpp文件和一个头文件。一个cpp文件包含单个类的实现,其声明在头文件中。另一个cpp文件包含int main函数。

该类的一个构造函数包含TCHAR参数,它被引用为LNK2019链接器错误中未解析的函数。

我正在使用visual studio 2010,我已将项目属性中的Character set选项设置为Not Set,以便我可以charwchar_t之间选择{ {1}}和UNICODE宏。

目前我已在主cpp文件的开头定义了这些文件,并且在这两个文件之后包含了头文件。但是,如果我在头文件的开头定义这些宏,则项目编译完美。

有没有解决这个问题?或者我是否必须对该类进行硬编码才能使用_UNICODEchar

感谢。

2 个答案:

答案 0 :(得分:3)

您收到链接器错误,因为您在main.cpp中定义了UNICODE / _UNICODE宏,但在类的实现.cpp中没有。因此,当main.cpp包含您的类的头文件时,它会将TCHAR视为wchar_t,但当您的实现.cpp包含您的头文件时,它会将TCHAR视为char而是。您有一个不匹配导致链接器错误,因为main.cpp调用您尚未实际实现的wchar_t构造函数。

您应该查找UNICODE / _UNICODE宏的存在,而不是实际手动定义它们。将“字符集”选项设置为MBCS或Unicode,以便IDE /编译器可以为整个项目全局管理宏。我不知道将它设置为“未设置”实际上是什么,但它不是你在这种情况下实际需要的。

答案 1 :(得分:1)

宏是预处理器构造,显然让您感到困惑。你的代码,即使你成功也会让别人感到困惑。必须在UNICODE定义之前定义宏_UNICODETCHAR,在使用TCHAR之前定义它们为时已晚。最好将它留给你的项目设置。

将项目的Character Set设置为Unicode,这是Windows内部使用的字符集。然后,TCHARwchar_t,API调用宏Something()始终扩展为SomethingW()。您可以在任何地方明确使用charwchar_t,代码的读者将准确地看到它们是什么,没有暗淡和不清楚TCHAR

Windows API函数SomethingA()只是SomethingW()的包装器,因此使用A版本的效率很低。如果您需要调用API函数SomethingA(),那么请明确地执行它,这样每个人都会发现您必须做一些效率低下的事情。