<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
(使用库中的 lib
、bin
和 include
文件夹)将使 CMake 在那里正确找到它们并将 C:\mingw\include
文件夹明确添加到包含列表中。 2个案例的结果如下:
- 添加为
-I
:这将被 g++ 和 ignoring ... as it is a non-system directory that duplicates a system directory
忽略
- 添加为
-isystem
:这会将目录添加到上面的列表中,并将其作为副本从其余目录中删除(使用-v
验证选项)。这意味着当找到 cstdlib
并评估 include_next
时,它将仅向下搜索列表。但是包含 stdlib.h
的目录不再位于列表下方而是向上,因此未被搜索。因此错误。
注意:我发现了 include_next
的另一个定义,它只丢弃包含 header 的目录。这在这种情况下可行,但会导致循环并已更改为所描述的行为。
目前的解决方案是简单地将库安装或复制到 C:\mingw\mingw32
。
我遇到错误
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
(使用库中的 lib
、bin
和 include
文件夹)将使 CMake 在那里正确找到它们并将 C:\mingw\include
文件夹明确添加到包含列表中。 2个案例的结果如下:
- 添加为
-I
:这将被 g++ 和ignoring ... as it is a non-system directory that duplicates a system directory
忽略
- 添加为
-isystem
:这会将目录添加到上面的列表中,并将其作为副本从其余目录中删除(使用-v
验证选项)。这意味着当找到cstdlib
并评估include_next
时,它将仅向下搜索列表。但是包含stdlib.h
的目录不再位于列表下方而是向上,因此未被搜索。因此错误。
注意:我发现了include_next
的另一个定义,它只丢弃包含 header 的目录。这在这种情况下可行,但会导致循环并已更改为所描述的行为。
目前的解决方案是简单地将库安装或复制到 C:\mingw\mingw32
。