C++ 致命错误:strtok_r.h:没有此类文件或目录(在MinGW中编译tesseract-ocr-3.01时)

C++ 致命错误:strtok_r.h:没有此类文件或目录(在MinGW中编译tesseract-ocr-3.01时),c++,compiler-errors,mingw,tesseract,C++,Compiler Errors,Mingw,Tesseract,我正在用MinGW编译tesseract-ocr-3.01,我得到了这个错误ambigs.cpp:31:22:致命错误:strok\u r.h:没有这样的文件或目录 这是错误所在的代码: #ifdef WIN32 #ifndef __GNUC__ #define strtok_r strtok_s #else #include "strtok_r.h" #endif /* __GNUC__ */ #endif /* WIN32 */ 编辑 我发现此功能请求已关闭。根据那里的评论: str

我正在用MinGW编译tesseract-ocr-3.01,我得到了这个错误
ambigs.cpp:31:22:致命错误:strok\u r.h:没有这样的文件或目录

这是错误所在的代码:

#ifdef WIN32
#ifndef __GNUC__
#define strtok_r strtok_s
#else
#include "strtok_r.h"
#endif  /* __GNUC__ */
#endif  /* WIN32 */

编辑

我发现此功能请求已关闭。根据那里的评论:

strtok_r()是可选的POSIX函数,仅用于 支持POSIX线程的实现。MinGW不支持 POSIX螺纹;因此,我认为这个函数没有任何意义 放置在一个基本的MinGW分布中

针对MS Windows的POSIX线程支持由pthreads-win32提供 项目也许他们已经提供了strtok_r()实现。如果 那么,你就可以用它了;如果没有,你可能会要求他们考虑 添加它


通过向项目的源中添加一个,最容易解决此问题:

char *strtok_r(char *str, const char *delim, char **save)
{
    char *res, *last;

    if( !save )
        return strtok(str, delim);
    if( !str && !(str = *save) )
        return NULL;
    last = str + strlen(str);
    if( (*save = res = strtok(str, delim)) )
    {
        *save += strlen(res);
        if( *save < last )
            (*save)++;
        else
            *save = NULL;
    }
    return res;
}
char*strtok\u r(char*str,const char*delim,char**save)
{
char*res,*last;
如果(!保存)
返回strtok(str,delim);
如果(!str&!(str=*保存))
返回NULL;
last=str+strlen(str);
如果((*save=res=strtok(str,delim)))
{
*save+=strlen(res);
如果(*保存<上次)
(*保存)++;
其他的
*save=NULL;
}
返回res;
}

通过向项目源中添加一个,问题最容易解决:

char *strtok_r(char *str, const char *delim, char **save)
{
    char *res, *last;

    if( !save )
        return strtok(str, delim);
    if( !str && !(str = *save) )
        return NULL;
    last = str + strlen(str);
    if( (*save = res = strtok(str, delim)) )
    {
        *save += strlen(res);
        if( *save < last )
            (*save)++;
        else
            *save = NULL;
    }
    return res;
}
char*strtok\u r(char*str,const char*delim,char**save)
{
char*res,*last;
如果(!保存)
返回strtok(str,delim);
如果(!str&!(str=*保存))
返回NULL;
last=str+strlen(str);
如果((*save=res=strtok(str,delim)))
{
*save+=strlen(res);
如果(*保存<上次)
(*保存)++;
其他的
*save=NULL;
}
返回res;
}

事实上,只要将上面的内容粘贴到ambigs.cpp,问题就解决了。事实上,只要将上面的内容粘贴到ambigs.cpp,问题就解决了。