1

私はファイルを作成するのが初めてで、これを少し試行錯誤しながらまとめました。このコードは、私のc++プログラムをコンパイルするために使用されます。

makefileと同じフォルダにある私のmain.cppファイル。mainが依存するヘッダーを含むlib/フォルダーがあります。

次のmakefileを使用すると、コードが正しく完全にコンパイルされます。しかし、私は*.oオブジェクトが残されているのを見つけることを期待していました。(「クリーン」ルールの有無にかかわらず両方を作成しようとしたことに注意してください。どちらの場合も同じ結果が得られます。)

#
# Makefile
#

CXX = g++
CCFLAGS = -O3 -I/sw/include -L/sw/lib
      ## /sw/include and /sw/lib contain dependencies for files in my lib/
LDFLAGS = -lpng
OPTS = $(CCFLAGS) $(LDFLAGS)

SOURCES = $(wildcard lib/*.cpp) main.cpp
OBJECTS = $(SOURCES: .cpp = .o)
TARGET = spirals

$(TARGET): $(OBJECTS)
    $(CXX) $(OPTS) $^ -o $@

.PHONY: depend
depend:
    g++ -MM $(SOURCES) > depend
      ## generate dependencies list
include depend

.PHONY: clean
clean:
    rm -f *.o lib/*.o $(TARGET)

また、問題が発生した場合に備えて、私はMacOSXを使用しており、プログラムはxcodeで設計されています。(xcodeには独自のビルドフローがあることは知っていますが、Linuxシステム用のコマンドラインプログラムを設計しているので、xcodeだけを経由するのではなく、bash環境でコンパイルとリンクをテストしたいと思います。)

質問:

  1. メインターゲットが作成された後、makefilesが* .oファイルを生成することを期待するのは正しいですか?

  2. もしそうなら、なぜ私のmakefileはこれをしないのですか?

4

1 に答える 1

4

$(TARGET)ルールによって実行されるコマンドを観察すると、次のようになります。

g++ -O3 -I/sw/include -L/sw/lib -lpng lib/bar.cpp lib/foo.cpp main.cpp -o spirals

$(OBJECTS)実際には *.cpp ファイルが含まれていることがわかります。要求していないため、*.o ファイルが残っていません。

問題はここにあります:

OBJECTS = $(SOURCES:.cpp=.o)

書かれているGNU makefileでは、この置換参照は余分なスペースで書かれているため、何にも一致$(OBJECTS)せず、$(SOURCES). 上記のように書き換えると、期待どおりに動作します。

(その他の注記:-lpng一般に、リンク コマンドの最後に移動する必要があるため、それ$(LDLIBS)を調整するために別の make 変数 (伝統的には と呼ばれます) を導入する必要があります。特に、makefile を初めて使用する場合は、スペルアウトした方がよいでしょう。と$(wildcard)計算され$(OBJECTS)た . -Iオプションはコンパイル中に必要であり、オプションはリンク中に使用されるので、必要な場合にのみ追加されるように、別のルールで使用される別の/変数-Lを配置することをお勧めします。)$(CXXFLAGS)$(LDFLAGS)

于 2012-06-28T21:22:16.990 に答える