尝试在stdlib.h中生成文件时出错" _wtoi64以及未在此范围内声明的其他文件"使用MinGW64& CMake的

时间:2014-11-06 12:43:32

标签: c++ cmake std mingw-w64

所以我尝试构建一个在OSX上编写的项目。我现在在窗户上。 我正在使用CMake和MinGW 64bit。

" cmake -G MinGW" Makefiles""工作正常,但当我尝试使用" mingw32-make"结果如下:

Scanning dependencies of target iDemo
[ 16%] Building CXX object CMakeFiles/iDemo.dir/src/Example.cpp.obj
[ 33%] Building CXX object CMakeFiles/iDemo.dir/src/DemoObject.cpp.obj
[ 50%] Building CXX object CMakeFiles/iDemo.dir/src/iDemo.cpp.obj
[ 66%] Building CXX object CMakeFiles/iDemo.dir/src/iDemoProcess.cpp.obj
[ 83%] Building CXX object CMakeFiles/iDemo.dir/src/Transform.cpp.obj
Linking CXX static library lib\libiDemo.a
[ 83%] Built target iDemo
Scanning dependencies of target iDemo
[100%] Building CXX object CMakeFiles/iDemo.dir/tools/iDemo.cpp.obj
In file included from D:/MinGW/mingw64/x86_64-w64-mingw32/include/assert.h:17:0,

                 from D:/opencv/opencv/sources/modules/core/include/opencv2/core/types_c.h:55,
                 from D:/opencv/opencv/sources/modules/core/include/opencv2/core/core_c.h:47,
                 from D:/opencv/opencv/sources/include/opencv/cv.h:63,
                 from D:\Stuff\code\tools\iDemo.cpp:3:
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'long long int wtoll(const wchar_t*)':
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h:653:100: error: '_wtoi64' was not declared in this scope
   __MINGW_EXTENSION __CRT_INLINE long long  __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); }

                    ^
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'wchar_t* lltow(long long int, wchar_t*, int)':
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h:654:122: error: '_i64tow' was not declared in this scope
   __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t* _w, int _i) { return _i64tow (_n, _w, _i); }

                                          ^
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'wchar_t* ulltow(long long unsigned int, wchar_t*, int)':
D:/MinGW/mingw64/x86_64-w64-mingw32/include/stdlib.h:655:133: error: '_ui64tow' was not declared in this scope
   __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); }

                                                     ^
CMakeFiles\iDemo.dir\build.make:54: recipe for target 'CMakeFiles/iDemo.dir/tools/iDemo.cpp.obj' failed
mingw32-make[2]: *** [CMakeFiles/iDemo.dir/tools/iDemo.cpp.obj] Error 1
CMakeFiles\Makefile2:94: recipe for target 'CMakeFiles/iDemo.dir/all' failed
mingw32-make[1]: *** [CMakeFiles/iDemo.dir/all] Error 2
Makefile:116: recipe for target 'all' failed
mingw32-make: *** [all] Error 2

现在stdlib.h中似乎导致此问题的行是:

#ifndef __CRT__NO_INLINE
  __MINGW_EXTENSION __CRT_INLINE long long  __cdecl atoll (const char * _c) { return _atoi64 (_c); }
  __MINGW_EXTENSION __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); }
  __MINGW_EXTENSION __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); }
  __MINGW_EXTENSION __CRT_INLINE long long  __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); }
  __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); }
  __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); }
#endif /* !__CRT__NO_INLINE */

有没有人知道可能导致这种情况的原因?也许甚至有同样的错误? 应该如何/在哪里_wtoi64(和其他2个遗失的)被宣布等?我怎么能自己做?

我发现stdlib.h中唯一的其他行是这些

  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
  __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix) __MINGW_ATTRIB_DEPRECATED_SEC_WARN;
  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str);
  __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale);

1 个答案:

答案 0 :(得分:0)

最后,这是一些愚蠢的交叉编译错误。 我不得不改变" iDemo.cpp"中的包含顺序:

#include <iostream>
#include <string>
#include <highgui.h>
#include <cv.h>

cv.h必须包含在其他所有内容之前。 对他来说,按照之前的顺序工作正常......