0

異なるディレクトリにファイルがあるプロジェクトがあります。ディレクトリ A には 2 つのディレクトリ B と C が含まれ、C にはディレクトリ D が含まれます。ファイルは B、C、D にあります。それをコンパイルするための makefile を作成し、メインの makefile を C に記述しました。C の Makefile には次の行が含まれます。

export LDFLAGS = -I ../B -I . -I ../C/D -lm

(最初は "../C/D" の代わりに "./D" だけを書いていましたが、エラーが発生したため、パスが B に対しても有効であることを確認するために変更しました。しかし、そうではありません何でも変えた)

B の makefile には、次のルールが含まれています。

%.o : %.c
    $(CC) $(CFLAGS) -o $@ -c $< $(LDFLAGS)

「make」を実行すると、B のファイルに D のファイルが含まれているため、エラーが発生し、このファイルが見つかりません。なんで ?ご協力いただきありがとうございます !

edit : -I オプションを使用してディレクトリを追加したときにまったく同じエラー (同じ B ヘッダー ファイルに含まれている同じ欠落ファイル) が発生したため、B メイクファイルに LDFLAGS があったときに、このエラーを生成するファイルの変更: エラーを引き起こす D ヘッダーを含む B ヘッダーを含む .cpp ファイルになりました。(ちなみに、c ファイルの中に 1 つの cpp ファイルがある理由を聞かないでください。それを開発したのは私ではありません...) B makefile 内の cpp ファイルの行は次のとおりです。

%.o : %.cpp
    g++ $(CFLAGS) -o $@ -c $< $(LDFLAGS)

ただし、この .cpp ファイルの .o は、すべての規則 ($(OBJS) を呼び出し、OBJS = $(SRC:.c=.o) として定義) にはありません。これは私の間違いだと思います。make を実行すると、最初に B ディレクトリに移動し、オプションを使用して c ファイルをコンパイルし、次のルールにより、ディレクトリを離れます。

b : 
    @(cd $(BDIR) && $(MAKE))

したがって、make が myccpfile.o が必要であることに気付くと、彼は魔法のようにその行を呼び出します。

g++    -c -o ../B/myccpfile.o ../B/mycppfile.cpp

だから今、私はこの呼び出しがどこから来たのか本当に理解していません.g ++を使用する唯一のルールにはCFLAGSとLDFLAGSがあるので、それは本当に奇妙です.なぜそれらが消えたのか理解できません...

4

1 に答える 1

0

CFLAGSビルドのコンパイル段階で -I オプションが必要です。B makefile に CFLAGS が適切な -I オプションで設定されていることを確認してください。

LDFLAGSリンカー オプションにのみ影響します。

于 2013-07-19T10:40:08.873 に答える