1

何か間違ったことをしているのかもしれませんが、makefile がこのようになっている場合、 makeは依存関係のタイムスタンプのチェックを拒否します。

# This makefile won't update the objects if you modify the .cpp files
# and it will only create them if they do not exist.
CC=g++
FL=-g
OBJECTD=../obj
SOURCED=../src

# Get all .cpp files in ../src
SOURCES=$(wildcard *.cpp)

# Convert .cpp to .o then add ../obj in front
OBJECTS=$(addprefix $(OBJECTD)/,$(patsubst %.cpp,%.o,$(SOURCES)))

# You sir must execute yourself whether you like it or not
.PHONY:all

all:$(OBJECTS)
    @echo : Leaving `src`


# This wont work as expected ...
# @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
# echoes Compiling logger.cpp
# But $(notdir $(patsubst %.o,%.cpp,$@)) will not be parsed
# correctly
$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    @echo : Compiling $(notdir $(patsubst %.o,%.cpp,$@))
    @$(CC) $(FL) -c $(notdir $(patsubst %.o,%.cpp,$@)) -o $@

私はそれが受け入れられないと信じています $(notdir $(patsubst %.o,%.cpp,$@))

ドキュメントにそのように記載されていても

複数のターゲットを持つパターン ルール (「パターン ルールの紹介」を参照) では、「$@」は、ルールのレシピを実行させたターゲットの名前です。


各ファイルを個別にコンパイルすると、正常に動作します。
例えば:

../obj/logger.o:logger.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@


+------------+
:エクストラ nfo :
+------------+


私が達成しようとしているのは、現在のディレクトリからソースを読み取り、変更されているかどうかを確認し、オブジェクトを現在のディレクトリではなく ../obj に配置しながらコンパイルに進むことです。
これは ../src にある makefile です。親ディレクトリにリンクするための別のファイルもあります。


取り組みたい構造のグラフィカル表現

 +--- Parent Directory ------+
 |        |        |         |
 |        |        |         |
bin      obj      inc       src
4

1 に答える 1

2

あなたのルール:

$(OBJECTS):$(notdir $(patsubst %.o,%.cpp,$@))
    ...

$@前提条件リストに値がないため、機能しません。マニュアルから:

[自動変数] は、ルールの前提条件リスト内で直接アクセスすることはできません。

これを試してください:

$(OBJECTS): $(OBJECTD)/%.o : %.cpp
    @echo : Compiling $<
    @$(CC) $(FL) -c $< -o $@
于 2013-07-20T01:10:22.110 に答える