【问题标题】:LNK2019 when define UNICODE/_UNICODELNK2019 定义 UNICODE/_UNICODE 时
【发布时间】:2020-07-01 04:35:01
【问题描述】:

我正在使用 TCHAR,但在定义 UNICODE / _UNICODE 时出现错误。这是我的代码。

function.h

#define UNICODE
#define _UNICODE

#include <tchar.h>
#include <windows.h>

BOOL bLogging(LPCTSTR szContent, ...);

function.cpp

#include "function.h"

BOOL bLogging(LPCTSTR szContent, ...)
{
    body of function
}

plugin.cpp

#include "function.h"

bool pluginInit(PLUG_INITSTRUCT* initStruct)
{
    bLogging(TEXT("hello, world!"));
}

上面的代码出错了

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
LNK2019 unresolved external symbol "int __cdecl bLogging(char const *,...)" (?bLogging@@YAHPBDZZ) referenced in function "bool __cdecl pluginInit(struct PLUG_INITSTRUCT *)" (?pluginInit@@YA_NPAUPLUG_INITSTRUCT@@@Z)

但如果没有 UNICODE / _UNICODE,它构建为 ASCII 字符,它工作得很好。

========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

【问题讨论】:

  • 确保您进行了全面清理和重建,并注意#include 以外的function.h。在编译器设置中使用#define 全局变量(如UNICODE_UNICODE)通常比单独的头文件更安全。
  • 添加了 Windows 和 WinApi 标签。删除 C++ 标记。
  • 从错误信息可以看出LPCTSTR仍然是ANSI char const*,所以你的#define UNICODE没有生效。我的猜测是有人在包含你的标题之前已经做了一个#include &lt;windows.h&gt;,所以你定义UNICODE太晚了。
  • 在我看来 LPCTSTR 正在做正确的事情,但 TEXT 不是。
  • 发布后,代码不会产生错误。错误出现在我们看不到的地方。例如,使用预编译的头文件是引入不匹配的预处理器符号的一种方法。

标签: windows winapi


【解决方案1】:

雷蒙德的评论可能是正确的答案。否则,您的代码看起来不错。

除非您尝试为 Windows 95 提供向后兼容性支持,否则您不需要 TCHAR 宏。避免这些东西并使用const wchar_t*LPCWSTR 作为您的字符串类型更简单。

以调整你的代码为例:

function.h

#pragma once
#include <windows.h>

BOOL bLogging(const wchar_t* szContent, ...);

function.cpp

#include "function.h"

BOOL bLogging(const wchar_t* szContent, ...)
{
    body of function
}

plugin.cpp

#include "function.h"

bool pluginInit(PLUG_INITSTRUCT* initStruct)
{
    bLogging(L"Hello World");
}

【讨论】:

  • 我已经解决了我的问题。我在定义 UNICODE / _UNICODE 之前包含了 windows.h。感谢您的帮助,但我喜欢让代码同时使用 wchar 和 char。
  • 实际上没有充分的理由在 2020 年继续使用 TCHAR 宏。选择一种字符编码并坚持下去。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多