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

TCHAR and unresolved external symbol (LNK2019) error in C++ program?

本文关键字:符号 LNK2019 C++ 错误 外部 程序 TCHAR      更新时间:2023-10-16

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

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

我使用的是 Visual Studio 2010,并且已将项目属性中的Character set选项设置为 Not Set,以便我可以使用UNICODE宏和_UNICODE宏在charwchar_t之间进行选择。

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

有没有办法解决这个问题?还是我必须对类进行硬编码以使用charwchar_t

谢谢。

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

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

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

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

Windows API函数SomethingA()只是SomethingW()的包装器,因此大量使用A版本效率低下。如果你需要调用 API 函数SomethingA(),那么明确地去做,这样每个人都会看到你必须做一些低效的事情。