0

この素敵なメイクファイルがあります (このチュートリアルから: https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile )。ただし、Web サイトにも記載されているように、この makefile はすべての .c および .cpp ファイルを単一のディレクトリから実行可能ファイルにコンパイルします。

program_NAME := myprogram
program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS :=
program_LIBRARY_DIRS :=
program_LIBRARIES :=

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

.PHONY: all clean distclean

all: $(program_NAME)

$(program_NAME): $(program_OBJS)
    $(LINK.cc) $(program_OBJS) -o $(program_NAME)

clean:
    @- $(RM) $(program_NAME)
    @- $(RM) $(program_OBJS)

distclean: clean

次のプログラムをコンパイルするように、このメイクファイルを変更するにはどうすればよいですか? たとえば、私のディレクトリが次の構造を持っている場合:

/project
    Makefile
    main.cpp
    /src
        Class1.cpp
        Class2.cpp
    /obj
        Class1.obj
        Class2.obj
    /bin
        myProgram
    /inc
        Class1.h
        Class2.h
    /lib
        libX.a
4

1 に答える 1

0

ダン。他の人がコメントで述べたように、手動でメイクファイルを作成するのではなく、メイクファイル (およびその他のプロジェクト) を生成する CMake またはその他のビルド システムを使用する必要があります。

チュートリアルで提供した makefile では、さまざまな変数のそれぞれが何を表しているかを理解することが重要です。program_C_SRCSとはprogram_CXX_SRCS、ビルドされる C および C++ ソース ファイルを表します。現在のディレクトリではなく「src」ディレクトリから取得されるように、ワイルドカードを変更できます。同様に、OBJS変数は、出力として生成されるオブジェクト ファイルのリストを定義します。同様に、これを構築する方法を変更して、「obj」サブディレクトリに出力されるようにすることもできます (ただし、さらにテストすることなく、xo が x.cpp から生成されたという通常の推論が、異なるディレクトリにまたがる場合に存続するかどうかはわかりません) ...自分で確認する必要があります)。

別のディレクトリからのヘッダーを含めることに関しては、program_INCLUDE_DIRSまさにこの目的のために定義されています。を使用するだけprogram_INCLUDE_DIRS := incで、インクルードを検索するディレクトリのリストに「inc」フォルダーが追加されます。program_LIBRARY_DIRS同様に、「lib」ディレクトリをに追加し、「X」を追加することにより、ライブラリ libX.a ライブラリに対してリンクできますprogram_LIBRARIES

いずれにせよ、メイクファイルがどのように機能するかを知ることは、歴史的な目的と、メイクファイルを生成するツールがどのように機能するかをデバッグ/理解するために役立ちます。ただし、今の時代、独自の makefile を作成することはお勧めできません。どうぞ、どうぞ、CMakeの学習に時間を割いてください。CMake などの新しいツールを学習するには、事前にいくらかの時間を投資する必要がありますが、長期的には、脆弱でビルドに時間がかかる非常にゆがんだ Makefile を作成するよりも多くの時間を節約できます。

于 2013-07-01T22:58:12.340 に答える