函数中引用的未解析的外部符号 _wcstok

Posted

技术标签:

【中文标题】函数中引用的未解析的外部符号 _wcstok【英文标题】:Unresolved external symbol _wcstok referenced in function 【发布时间】:2016-01-18 04:53:41 【问题描述】:
#include <ntddk.h>
#include <string.h>

.....

PWCHAR tmpBuf = NULL, pwBuf = NULL;;

tmpBuf = ExallocatePoolWithTag(NonPagePool, (MAX_SIZE + 1) * sizeof(WCHAR), BUFFER_TAG);
pwBuf = ExAllocatePoolWithTag(NonPagedPool, (MAX_SIZE + 1) * sizeof(WCHAR), BUFFER_TAG);

RtlStringCchPrintfW(tmpBuf, MAX_SIZE + 1, L"ws", ProcName);

pwBuf = wcstok(tmpBuf, L"\\");

...

错误信息:

错误 LNK2019:未解析的外部符号 _wcstok 在函数中引用

但是。 wcslen 有效

【问题讨论】:

什么版本的编译器/ddk/etc?看看Breaking Changes in Visual C++ 2015 是否适用 - 查找wcstok 部分。 What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 内核中可用的库与用户模式不同。 wcstok 可能不完全 Visual Studio 2013,WDK 8.1 你是用C还是C++模式编译? 【参考方案1】:

Microsoft 可能会尝试强制您使用 wsctok_s,而不是符合标准但不可重入的 wsctok,尤其是在与 Windows 内核链接的设备驱动程序代码中。

如果strtok_s 也缺失,则表示用于内核和驱动程序开发的C 库不完整。您处于托管环境中,标准 C 库的某些部分可能会丢失。

请注意,您没有使用 wcstok() 的旧原型:Microsoft 在其 VisualStudio 2015 中更改了 wcstok 的原型,以使其符合 C 标准:

 wchar_t *wcstok(wchar_t *restrict ws1, const wchar_t *restrict ws2,
                 wchar_t **restrict ptr);

最好避免使用这个函数,直接把代码改成wcschr()

如果wcschr 也丢失了,使用这个简单的实现:

/* 7.29.4.5 Wide string search functions */
wchar_t *wcschr(const wchar_t *s, wchar_t c) 
    for (;;) 
        if (*s == c)
            return (wchar_t *)s;
        if (*s++ == L'\0')
            return NULL;
    

这是一个符合标准的wcstok() 实现:

wchar_t *wcstok(wchar_t *restrict s1, const wchar_t *restrict s2,
                wchar_t **restrict ptr) 
    wchar_t *p;

    if (s1 == NULL)
        s1 = *ptr;
    while (*s1 && wcschr(s2, *s1))
        s1++;
    if (!*s1) 
        *ptr = s1;
        return NULL;
    
    for (p = s1; *s1 && !wcschr(s2, *s1); s1++)
        continue;
    if (*s1)
        *s1++ = L'\0';
    *ptr = s1;
    return p;

【讨论】:

同样的错误 :( 错误 LNK2019: 函数中引用了未解析的外部符号 _wcstok_s @koala:我修改了答案,你可以取消投反对票,改为投反对票;-&gt;,但我怀疑你是投反对票的人……

以上是关于函数中引用的未解析的外部符号 _wcstok的主要内容,如果未能解决你的问题,请参考以下文章

函数_main(OPENGL C++)中引用的未解析的外部符号_____________

LNK2019:函数“void __cdecl mainfunc(void)”中引用的未解析外部符号 _kiss_fftr_alloc

LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用

无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

[转]无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用

error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用