1

注:この質問は、私が書いている間に解決されました。この問題に関する情報を見つけるのに苦労したので、とにかく投稿すると役立つと思います。アドバイス歓迎。


こんにちは、みんな。最近、Linux Mint に GCC 4.9.1 をインストールし、いくつかのプロジェクトをコンパイルしましたが、すべてがスムーズに進みました。

今度は、ソース ファイルの並べ替えから始めて、そのようなプロジェクトの 1 つに再び取り組みたいと思います。そこで、新しいフォルダーを作成し、いくつかの .h ファイルと .tpp ファイルをその中に移動しました。構造は次のようになります。

.
├── clip
│   ├── Clip.h
│   ├── ClipImpl.tpp
│   └── Mask.h
:
├── main.cpp
:
├── vect.cpp
├── vect.h
:

main.cppは単なる#include "clip/Clip.h"であり、後でテスト目的でいくつかのテンプレートのインスタンス化が含まれます。clip/Clip.hが含まれclip/Mask.hていますvect.h

後者のインクルードは満たされていないことに注意してください。そのため、コンパイラーは正しく文句を言います。ここで、すべての#includes を、作成元のファイルではなく、プロジェクトのルートに相対的にしたいと考えています。わかりました、私は自分の Makefile を編集します:

# Retrieve the root directory
WD = $(shell pwd)

...

# Add it to the include search paths
%.o: %.cpp #           vvvvvvv
    $(CXX) $(CXXFLAGS) -I$(WD) -c $<

そして… ブーム??

g++ -std=c++1y `sdl2-config --cflags` -Wall -Wextra -Winline -fno-rtti -I/home/quentin/NetBeansProjects/glk -c AutoDisplayed.cpp
In file included from /home/quentin/NetBeansProjects/glk/time.h:4:0,
                 from /usr/include/sched.h:33,
                 from /usr/include/pthread.h:23,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/x86_64-unknown-linux-gnu/bits/gthr-default.h:35,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/x86_64-unknown-linux-gnu/bits/gthr.h:148,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/ext/atomicity.h:35,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/bits/basic_string.h:39,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/string:52,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/stdexcept:39,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/array:38,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/tuple:39,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/bits/stl_map.h:63,
                 from /opt/gcc-4.9.1/include/c++/4.9.1/map:61,
                 from AutoDisplayed.h:5,
                 from AutoDisplayed.cpp:1:
/opt/gcc-4.9.1/include/c++/4.9.1/functional: In member function ‘_Result std::_Bind<_Functor(_Bound_args ...)>::operator()(_Args&& ...)’:
/opt/gcc-4.9.1/include/c++/4.9.1/functional:1322:8: error: ‘forward_as_tuple’ is not a member of ‘std’
        std::forward_as_tuple(std::forward<_Args>(__args)...),
        ^

私はかなりのことを検索しましたが、実際にこの文を書いているときに何が起こっているのかを知りました.

4

1 に答える 1

5

実際time.h、プロジェクトのルートにファイルがありました。これまでのところ問題はありませんでしたが、標準ヘッダーの代わりに含まれるようになりました<time.h>。ファイルの名前を変更するだけでなく、GCCのドキュメントを掘り下げて、問題の原因を見つけました(強調は私のものです):

-Idirヘッダー ファイルを検索するディレクトリのリストの先頭
に ディレクトリ dir を追加します。これは、システム ヘッダー ファイルをオーバーライドするために使用できます。[...] ディレクトリは左から右の順序でスキャンされます。標準のシステム ディレクトリが の後に続きます。

したがって、 -I オプションは、リストの前にディレクトリを配置することでシステム ヘッダーをオーバーライドします。ダメです。後ろに置きたかったのですが、その下に解決策があります:

-iquotedir
'<code>#include "file"' の場合のみ、ヘッダー ファイルを検索するディレクトリのリストの先頭にディレクトリ dir を追加します。'<code>#include <file>' は検索されません。それ以外の場合は -I と同様です。

おー。それがまさに私が必要としていたものです。私がそのオプションについて聞いたことがなく、ずっと間違った目的で -I を使用してきたのは残念です。しかたがない。事件解決!

于 2014-09-24T08:04:58.143 に答える