17

What is the best method to include a file that has same name in another folder from additional include directories?

Example:

lib1/include/foo.h
lib2/include/foo.h

where both lib1/include and lib2/include are added in additional include directories.

Edit:

The libs are from different SDK's and every developer installs them in his own place. Only thing that is sure is that both folders are in IDE's additional include paths

method 1:

#include "../../lib1/include/foo.h

method2:

Add lib1/include before lib2/include in search paths and because they are searched in order with:

#include "foo.h"

lib1/include/foo.h will be included

4

5 に答える 5

8
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

これがそれらのヘッダーへの実際の相対パスであり、インクルードガードが異なる限り、問題ありません。たとえば、両方のfoo.hが使用する場合

#ifndef _foo_h_

次に、これはあなたが望まない何かをあなたに与えるでしょう(それはあなたに1つだけを含み、両方を含まず、どちらが実行の順序に依存します)。

于 2011-03-02T13:48:32.343 に答える
5

あなたはこれを行うことができます:

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

両方の親ディレクトリlib1lib2がインクルードの検索パスに含まれていることを確認します(実際のサブディレクトリ自体は含まれません)。include

両方のヘッダーがインクルードガードと同じシンボルを使用している場合、このメソッドは機能しないことに注意してください。2つのインクルード間の競合するシンボルの定義を解除する必要があります。

#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
于 2011-03-02T13:45:50.887 に答える
5

まず、この回答は、2 つのヘッダーのインクルード ガードに互換性がある (つまり、同じシンボルではない) ことを前提としています。

できることの 1 つは、目的のヘッダー ファイルへの既知の場所にリンクを作成し、リンク自体に個別の名前を付けることです。たとえば、2 つのライブラリが $LIB1PATH と $LIB2PATH にインストールされているとします。ビルド環境が異なれば、これらの値も異なる可能性があります。したがって、取得したいヘッダーは $LIB1PATH/include/foo.h と $LIB2PATH/include/foo.h にあります。

これで 2 つの方法が考えられます。1 つは、直接リンクを作成することです。これは、プロジェクトのディレクトリ ツリーでは次のようになります。

$PROJDIR/
    include/
    lib_include/
        lib1_foo.h -> $LIB1PATH/include/foo.h
        lib2_foo.h -> $LIB2PATH/include/foo.h
    src/

コードがリポジトリにある場合、これらのリンクをチェックインできないため、これは扱いにくいものになる可能性があります。他の環境では間違っているでしょう。また、これらのリンクがたくさんあり、ライブラリが少ない場合は、lib1 または lib2 が移動するたびにそれらすべてを再作成する必要があります...クールではありません。プロジェクトのディレクトリを含むディレクトリにリンクを作成することで、この問題を回避できます。

$PROJDIR/
    include/
    lib_include/
        lib1_foo.h -> ../../lib1/include/foo.h
        lib2_foo.h -> ../../lib2/include/foo.h
    src/
lib1 -> $LIB1PATH/
lib2 -> $LIB2PATH/

どちらの場合も、$PROJDIR/lib_includeインクルード パス上にあることを確認する必要があります。また、 2 つのヘッダーがそれらのディレクトリからより多くのヘッダーを取得する場合にのみ、インクルード パスに and を含める$LIB1PATH/include必要があります。リンクを入れてを取り除くこともできますが、私はこれらのものを分けておくのが好きです.$LIB2PATH/includefoo.hincludelib_include

于 2011-03-02T16:57:23.263 に答える
2

リストにある明確なディレクトリからのファイルを含めます-I(つまり、lib1とlib2を含むディレクトリへのパスです):

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

lib1/include/foo.hしたがって、プリコンパイラはそのディレクトリ リスト内を調べますが、lib1/include/それlib2/include/は親ディレクトリからではなく、親ディレクトリからのみ行われるため、あいまいさはありません。

前に述べたように、ガードには注意してください。lib ヘッダーの場合でも、このような混乱を避けるために名前に lib 名を含める必要があります。

于 2011-03-02T14:22:32.303 に答える