私は、g ++を使用して単一のファイルとhファイルをコンパイルおよびリンクするLinux用の単純で推奨される「最小限の」c ++ makefileを探しています。理想的には、makeファイルには物理ファイル名すら含まれず、.cppから.oへの変換のみが含まれます。 autoconfの恐怖に飛び込むことなくそのようなmakefileを生成するための最良の方法は何ですか?
現在のディレクトリには、たとえば
t.cpp t.h
そのためのメイクファイルを作成したいと思います。 autoconfを試しましたが、.hがg ++ではなくgccであると想定しています。はい、初心者ではありませんが、私は何年も前からプロジェクト操作の最良のアプローチを再学習しているため、小さなプロジェクトのメイクファイルを作成および維持するための自動化された方法を探しています。
単一のファイルの場合は、次のように入力できます
make t
そしてそれは呼び出す
g++ t.cpp -o t
これは、ディレクトリにMakefileを必要としませんが、t.cppとt.cとt.Javaなどがあると混乱します。
また、実際のMakefile:
SOURCES := t.cpp
# Objs are all the sources, with .cpp replaced by .o
OBJS := $(SOURCES:.cpp=.o)
all: t
# Compile the binary 't' by calling the compiler with cflags, lflags, and any libs (if defined) and the list of objects.
t: $(OBJS)
$(CC) $(CFLAGS) -o t $(OBJS) $(LFLAGS) $(LIBS)
# Get a .o from a .cpp by calling compiler with cflags and includes (if defined)
.cpp.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $<
これが私のコードスニペットディレクトリからの一般的なメイクファイルです:
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
BINS=$(SOURCES:.cpp=)
CFLAGS+=-MMD
CXXFLAGS+=-MMD
all: $(BINS)
.PHONY: clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(BINS)
-include $(DEPS)
1つのバイナリを生成する1つの.cppソースがある限り、これ以上何も必要ありません。 GNU makeでのみ使用し、依存関係の生成ではgcc構文(iccでもサポートされています)を使用します。Sunコンパイラを使用している場合は、「-MMD」を「」に変更する必要があります。 -xMMD "。また、このコードを貼り付けるときにclean:
の後の行の先頭のタブがスペースに変更されないようにしてください。そうしないと、make
で区切り文字が見つからないというエラーが発生します。
事前構成されたシステム全体のmake
設定がないと仮定します。
CXX = g++
CPPFLAGS = # put pre-processor settings (-I, -D, etc) here
CXXFLAGS = -Wall # put compiler settings here
LDFLAGS = # put linker settings here
test: test.o
$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) test.o
.cpp.o:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
test.cpp: test.h
かなり小さいGNU Makefile、事前定義されたルールと自動depsを使用:
CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
$(RM) *.o *.d program
-include $(wildcard *.d)
おまけ を見たことがありますか?
OMakeroot
open build/C
DefineCommandVars()
.SUBDIRS: .
OMakefile
.DEFAULT: $(CXXProgram test, test)
次に、LinuxまたはWindowsでは、次のように入力します。
omake
ボーナスとして、あなたは自動的に以下を取得します:
最小限のMakefileが他にどのように見えるかを探していました
some_stuff:
@echo "Hello World"
私はこのパーティーに遅れていることを知っていますが、私も帽子をリングに投げ込むと思いました。以下は、私が長年使用してきた1つのディレクトリプロジェクトMakefileです。少し変更を加えるだけで、複数のディレクトリ(src、obj、bin、header、testなど)を使用するように拡張できます。すべてのヘッダーとソースファイルが現在のディレクトリにあると想定します。また、出力バイナリ名に使用される名前をプロジェクトに付ける必要があります。
NAME = my_project
FILES = $(Shell basename -a $$(ls *.cpp) | sed 's/\.cpp//g')
SRC = $(patsubst %, %.cpp, $(FILES))
OBJ = $(patsubst %, %.o, $(FILES))
HDR = $(patsubst %, -include %.h, $(FILES))
CXX = g++ -Wall
%.o : %.cpp
$(CXX) $(HDR) -c -o $@ $<
build: $(OBJ)
$(CXX) -o $(NAME) $(OBJ)
clean:
rm -vf $(NAME) $(OBJ)
基本的なMakefileの作成に関するいくつかの良い参考資料
http://en.wikipedia.org/wiki/Make_(software)
http://mrbook.org/tutorials/make/
http://www.opussoftware.com/tutorial/TutMakefile.htm
http://www.hsrl.rutgers.edu/ug/make_help.html
特に最初のカップルには、あなたが説明したような最小限のMakefileの例があります。お役に立てば幸いです。
デバッグオプション付きのSConstruct:
env = Environment()
if ARGUMENTS.get('debug', 0):
env.Append(CCFLAGS = ' -g')
env.Program( source = "template.cpp" )
フロリンは良い出発点を持っています。私はgnuautoconfが好きではなかったので、そこから始めて概念をさらに進め、MagicMakefileと呼びました。シンプルなものからより複雑なものまで、3つのバージョンがあります。最新のものは現在githubにあります: https://github.com/jdkoftinoff/magicmake
基本的に、プロジェクトのソースファイルの標準レイアウトがあることを前提とし、ワイルドカード関数を使用してメイクファイルルールをその場で作成し、評価し、ヘッダーファイルの依存関係を処理し、クロスコンパイル、単体テスト、インストール、およびパッケージング。
[編集]この時点で、多くのビルドシステムに役立つプロジェクトファイルが生成されるため、すべてのプロジェクトにcmakeを使用しています。
ジェフ・コフティノフ