mingw/include/c++/cstdlib: stdlib.h: 没有那个文件或目录。

8

我正在尝试在Fedora 26上使用MinGW交叉编译64位Windows的OpenImageIO。在使用yum获取依赖项的mingw版本后,我运行了mingw64-cmake,然后是make。然而,我立即收到一个有关未找到stdlib.h的编译错误。

[  0%] Built target CopyFiles
[  0%] Building CXX object src/libutil/CMakeFiles/OpenImageIO_Util.dir/argparse.cpp.obj
In file included from .../oiio/src/libutil/argparse.cpp:36:0:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/cstdlib:75:15: fatal error: stdlib.h: No such file or directory
#include_next <stdlib.h>
              ^~~~~~~~~~
compilation terminated.

我已经确认stdlib.h文件至少在/usr/include//usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/中被找到,而给编译器错误的文件也在这里。
那么为什么我仍然收到错误消息stdlib.h: No such file or directory
更新: 我进行了额外的研究并了解到以下内容:#include_next预处理指令的行为与#include指令相似,但它专门排除包含文件所在目录,不会搜索该文件的路径。 这就解释了为什么cstdlib不能从同一文件夹中找到stdlib.h。但是cstdlib是MinGW的一部分,而不是我正在尝试编译的任何代码的一部分。因此,我仍然不知道出了什么问题或如何修复此错误。
编辑:以下是编译器版本信息,如果有用的话:https://pastebin.com/PZiXS2fg。这是一个全新的安装,因此不应该有任何异常情况。

出于好奇,你的 mingw64 包含哪个 g++ 版本? - TriskalJM
@gcc版本7.1.0 20170502(Fedora MinGW 7.1.0-1.fc26) - Steve
1
听起来不太好。如果你只用g++ -c编译#include <cstdlib>,或者只用gcc -c编译#include <stdlib.h>,它能找到吗? - ssbssa
你能添加 make VERBOSE=1 的输出吗?这样我们就可以知道用于编译 argparse.cpp 的完整命令行选项了。 - ssbssa
1
@ssbsa 我也很好奇。不过,从 CMakeFile 中删除 -isystem 似乎可以解决问题。之后我遇到的新错误是通过从 oiio/src/include/OpenImageIO/missing_math.h 中消除不必要的 Win32 特定定义来解决的。现在没有更多的错误了,它似乎可以编译。感谢你的提示!仍然需要弄清楚 -isystem 来自哪里以及如何在 cmake 后修复它,这样就可以变成一个答案。 - Steve
显示剩余7条评论
2个回答

5

我已解决此问题,现在可以重新编译。

我的解决方案是将变量 CPLUS_INCLUDE_PATH 添加到路径中,并将其设置为 MinGW C++ 包含目录,对我来说是:C:\MinGW\lib\gcc\mingw32\6.3.0\include\c++

希望对您也有帮助。


可以运行!但是必须重新启动计算机。 - L. Francis Cong

1
使用#include_next似乎会导致很多问题,根据我的谷歌搜索结果。尝试使用以下语法直接包含stdlib.h:
-isystem /usr/x86_64-w64-ming32/sys-root/mingw/include/c++

这个语法是在 gcc 6.0 中添加的,用于解决与第三方库相关的问题。请参见 此处 了解具体方法和原因。 编辑: 根据有关 gcc wrapper_headers 和 #include_next 的新信息更改了答案。

这些是GCC配置标志。您是否建议重新编译GCC? - Florian Weimer
我尝试运行: mingw64-cmake -DCMAKE_CXX_FLAGS='--with-gxx-include-dir=/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++ --enable-version-specific-runtime-libs' 但是我收到了以下错误信息: 未识别的命令行选项 '--with-gxx-include...' - Steve
@TriskalJM 我添加了 -isystem /usr/x86_64-w64-ming32/sys-root/mingw/include/c++ 标志,通过 make -n 确认 g++ 确实使用了该标志,并确认 stdlib.h 在该目录中。然而,仍然得到完全相同的错误。 - Steve
你提到了包含 stdlib.h 版本的两个目录。g++ 正在使用哪个版本? - TriskalJM
可能是搜索顺序的问题。是先包含/usr/include,还是先包含/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/ - TriskalJM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接