<stdlib.h> 将 MinGw 包含目录添加到搜索路径时未在 MinGW 中找到

<stdlib.h> not found in MinGW when MinGw include directory is added to search path

我遇到错误

c:\mingw\lib\gcc\mingw32.3.0\include\c++\cstdlib:75:25: fatal error: stdlib.h: No such file or directory
 #include_next <stdlib.h>

将 C:\MinGW\include 添加到编译器时包含搜索路径:
echo "#include <cstdlib>" | g++ -x c++ - -isystem C:/MinGW/include -o /dev/nul

但是 CMake 这样做是因为一些库(例如 libcurl)安装到 C:\MinGW 中,因此 curl 包含目录是 C:\MinGW\include

我是不是做错了什么或者这是 MinGW 中的错误? 我正在使用 MinGW 5.0.1.

什么有效:echo "#include <cstdlib>" | g++ -x c++ - -IC:/MinGW/include -o /dev/nul 但我不想包含 curl include dirs 等,因为 non-system 包含。

mingw/include/c++/cstdlib: stdlib.h: No such file or directory相关

背景:我正在使用 cmake 生成 makefile。所以CMakelists.txt中有一个find_package(Curl)和一个include_directories(SYSTEM CURL_INCLUDE_DIRS)。由于 libcurl 安装到 C:/MinGW,因此 CURL_INCLUDE_DIRS 将是 C:/MinGW/include,因此包含 -isystem。我不想省略 SYSTEM,因为这可能会导致为 libcurl headers 生成警告。当然还有更多的库也以相同的方式安装,我想保持 cmake 文件的可移植性。

问题在于使用了C++标准header的include_next。根据 https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html 它将包括 header searching the list of header file directories after the directory in which the current file was found。标准包含目录(使用 g++ -v)是(更正):

c:\mingw\lib/gcc/mingw32/6.3.0/include/c++
c:\mingw\lib/gcc/mingw32/6.3.0/include/c++/mingw32
c:\mingw\lib/gcc/mingw32/6.3.0/include/c++/backward
c:\mingw\lib/gcc/mingw32/6.3.0/include
c:\mingw\include
c:\mingw\lib/gcc/mingw32/6.3.0/include-fixed
c:\mingw\mingw32/include

因此 cstdlib 将在 c:\mingw\lib/gcc/mingw32/6.3.0/include/c++ 中找到,而 include_next "stdlib.h" 将在列表中进一步向下并在 c:\mingw\include 中找到它。

现在的问题是:将库安装到 C:\mingw(使用库中的 libbininclude 文件夹)将使 CMake 在那里正确找到它们并将 C:\mingw\include 文件夹明确添加到包含列表中。 2个案例的结果如下:

  1. 添加为 -I:这将被 g++ 和 ignoring ... as it is a non-system directory that duplicates a system directory
  2. 忽略
  3. 添加为-isystem:这会将目录添加到上面的列表中,并将其作为副本从其余目录中删除(使用-v验证选项)。这意味着当找到 cstdlib 并评估 include_next 时,它将仅向下搜索列表。但是包含 stdlib.h 的目录不再位于列表下方而是向上,因此未被搜索。因此错误。
    注意:我发现了 include_next 的另一个定义,它只丢弃包含 header 的目录。这在这种情况下可行,但会导致循环并已更改为所描述的行为。

目前的解决方案是简单地将库安装或复制到 C:\mingw\mingw32