17

gcc は-I-オプションを提供します。このオプションでは、 の-I前のディレクトリ-I-で引用符で囲まれたインクルード ( #include "foo.h") が検索され、-I次のディレクトリ-I-で括弧で囲まれたインクルード ( ) が検索#include <foo.h>されます。

-I-別の非常に重要な効果があります。#includeが含まれているソース ファイルのディレクトリをデフォルトの検索パスから削除します。通常、引用符で囲まれたインクルードは常にソース ファイルのディレクトリを検索し、どのディレクトリよりも先に-I検索します。 -I-したがって、優先されるデフォルトのパスを削除することにより、引用符で囲まれたインクルード ファイルの場所を希望の順序で正確に指定できます。

それで、私は私の質問に答えたようですね。いいえ。今使用する-I-と、次の厄介なグラムが表示されます。

cc1: note: obsolete option -I- used, please use -iquote instead

問題は、現在のディレクトリが検索パスから削除され-iquoteないことです。に何を提供しても、常に最初に検索され-iquoteます。

問題は-I-、 を使用せずに と同じ効果を得るにはどうすればよいかという-I-ことです。

詳細:

ファイルが次のように配置されているとします。

srcdir/
    configure
    file1.c
    file2.c
    config.h

builddir/
    Makefile
    file1.o
    file2.o
    config.h
    libpudding.a

config.hさまざまな理由から、から削除することはできませんsrcdir(他のプラットフォームでのビルド プロセスに影響を与えます)。ただし、 inよりもconfig.hfrombuilddirを優先して含めたいと考えています。zconf.hsrcdir

これは GCC の-I-フラグで実現できますが、それ以外の場合は不可能のようです。

更新された質問:

わかりました、GNU CC 開発者は非推奨のようです-I-が、その機能を達成するための代替方法を提供していませんでした。したがって、私の更新された質問は次のとおりです。これを開発者の注意を引くための最も効果的な方法は何ですか。これにより、どちらか-I-が廃止されない可能性が高くなります(指定を処理する非常にエレガントな方法であるため、これが最も望ましいと思います)検索、-iquotexxx よりもはるかに見苦しくありません)、または引用符で囲まれたインクルード検索パスから現在のディレクトリを削除する方法が提供されていますか?

4

1 に答える 1

4

ツリー外ビルドの煩わしzconf.hさに取り組んできたので、質問が非常にトリッキーな場合、それはしばしば間違った質問であるというあなたの指摘に間違いなく戻ります. あなたは絶対に正しいです。正しい質問は、から生成する必要があるのに、なぜzconf.hが存在するのかということです。ファイルは、常に生成されるか、特定の構成設定のセットに対して生成されないようにする必要があります。同じビルドで提供と生成の両方を行うことはできません。srcdirzconf.h.in

ここでの最善の解決策はzconf.h、ソース ツリーから削除zconf.h.inし、CMake ビルドで行うのと同じように常にそこから生成することです。なぜそれがCMakeとMakeの別の方法で行われたのか、私にははっきりしていません。zconf.hautoconfがなく、make 用にビルド済みのものを使用するが、CMake 用に CMake で生成されたものを使用することがポイントである場合は、それをzconf.h.in(実際に) そのまま出荷し、コピーします。 Makefile のビルド ツリーに追加します。

の奇妙な動作を取り除くことは-I-良い動きでした。同じ名前で参照される検索パスに複数のファイルがあると、非常に混乱し、見苦しくなります。検索順序が重要な場合は-I、プロジェクトまたはビルドで何かが正しく設計されていません。何#include "foo.h"を指しているのかを推測する必要はありません。間違ったファイルを編集していることに簡単に気付くような状況に陥ってはいけません。

zlib ビルドを改善するあなたの仕事に拍手を送ります。zlib は確かに構築するのが最も難しいパッケージではありませんが、確かに最も簡単でもありません (特に、contrib/minizip が必要な場合は、私は常にそうしています)。

于 2012-07-24T03:58:45.890 に答える