MinGW g++无法在其自己的include目录中找到头文件

11
我最近安装了MinGW,使用了包含boost C++库的nuwen's MinGW distribution的最新版本。具体而言,我想要使用boost库提供的scoped_ptr。然而,当我尝试在我的头文件中包含scoped_ptr (#include <boost/scoped_ptr.hpp>)时,编译器会抛出
error: boost/scoped_ptr.hpp: No such file or directory Makefile:
compile:
    g++ -o gen/cavestory src/**.cc 
run:
    gen/cavestory

另外,我在MinGW的include目录下添加了SDL的反向版本,路径为SDL/**。所有的头文件都在那里,我已经检查过,在我的include SDL/SDL.h>语句下编译器会抛出类似的错误。
我尝试过的事情有:
在我的包含语句中使用<>""的各种变化
删除.h.hpp
将编译器标志设置为具体搜索包含头文件的目录g++ -I 这段代码在早期版本的MinGW上编译过,而MinGW分发版的作者明确表示他更改了g++编译器选项以默认使用C++11,因此我认为很可能是与此有关。但我的谷歌功夫还没有取得成果。

2
你的mingw可能被遮蔽了。 - Rapptz
1
在 makefile 中尝试使用 "which g++" 命令来确定哪个被调用。顺便说一句,你不应该在 Makefile 中硬编码 "g++"。这是不好的形式。请参见:https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile - Michael Aaron Safyan
@MichaelAaronSafyan 语法是什么? - tjtoml
@enhzflep 是的,两个安装都位于C:\MinGW\。在安装更新时,我完全清空了MinGw目录。 - tjtoml
4
创建一个空的 empty.c 文件,然后执行命令:gcc -v empty.c。将输出粘贴到您的问题中。其中包括编译器将在其中搜索包含文件的目录。假设您已将 Nuwen 发行版安装到 c:\mingw 中,则 scoped_ptr.hpp 应该在 c:\mingw\include\boost\ 目录下。 - Michael Burr
显示剩余4条评论
1个回答

9
我想到的解决方法:根据Michael Burr上面的评论,我使用详细标志运行编译器。由于某种原因,被搜索的包含目录未位于MinGw根目录中,而是深藏在lib目录中。我预计这应该可以通过其中一个安装脚本来修复,但是可能我没有正确地运行它,或者它在我的系统上无法正常工作。在我的机器上,我需要添加相关文件的目录是:

C:\MinGW\lib\gcc\x86_64-w64-mingw32\4.8.2\include

这是一个快速而简单的解决办法。我相信肯定存在更好的方法,但是这让我最快速地启动并运行了。


啊哈 - 我一直在运行 set_distro_paths.bat 脚本来设置 MinGW 可执行文件的路径。我不知道它还会添加(或设置)一些目录,例如 c:\mingw\includeC_INCLUDE_PATHCPLUS_INCLUDE_PATH 环境变量中。这就是获取 boost 和其他库的方法。我以为 set_distro_paths.bat 只是设置路径而已。 - Michael Burr
另外,有趣/奇怪的是,使用“-I”选项对你来说并没有起作用。也许你指定了“-I c:\mingw\include\boost”而不是只指定“-I c:\mingw\include”? - Michael Burr
我都试过了。现在我正在抱怨链接器无法找到SDL.lib和SDLMain.lib。我得到了每个SDL_*调用的未定义引用。 - tjtoml
您可能想在问题中发布“-v”输出。另外,请记住,自11.0版以来,nuwen的MinGW是x64本地支持的(它默认构建x64目标——我认为它甚至不支持“-m32”选项构建32位目标),因此请确保您所添加到构建中的任何库也是x64的。如果您安装了32位SDL库,则可能导致未定义的引用,因为一些名称修饰规则对于x86和x64是不同的。 - Michael Burr

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