web-dev-qa-db-ja.com

Linux用の最小c ++ makeファイル

私は、g ++を使用して単一のファイルとhファイルをコンパイルおよびリンクするLinux用の単純で推奨される「最小限の」c ++ makefileを探しています。理想的には、makeファイルには物理ファイル名すら含まれず、.cppから.oへの変換のみが含まれます。 autoconfの恐怖に飛び込むことなくそのようなmakefileを生成するための最良の方法は何ですか?

現在のディレクトリには、たとえば

t.cpp t.h

そのためのメイクファイルを作成したいと思います。 autoconfを試しましたが、.hがg ++ではなくgccであると想定しています。はい、初心者ではありませんが、私は何年も前からプロジェクト操作の最良のアプローチを再学習しているため、小さなプロジェクトのメイクファイルを作成および維持するための自動化された方法を探しています。

22
RichieHH

単一のファイルの場合は、次のように入力できます

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 $<
30
hazzen

これが私のコードスニペットディレクトリからの一般的なメイクファイルです:

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で区切り文字が見つからないというエラーが発生します。

18
florin

SCons を見たことがありますか?

以下を使用してSConstructファイルを作成するだけです。

Program("t.cpp")

次に、次のように入力します。

scons

完了!

8
grieve

事前構成されたシステム全体の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
5
Alnitak

かなり小さい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)
2
Sam Watkins

おまけ を見たことがありますか?

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

次に、LinuxまたはWindowsでは、次のように入力します。

omake

ボーナスとして、あなたは自動的に以下を取得します:

  • -jオプションを使用した並列ビルド(makeと同じ)。
  • タイムスタンプの代わりにMD5チェックサム(ビルドは時刻同期の失敗に対して回復力があります)。
  • 自動で正確なC/C++ヘッダーの依存関係。
  • 正確なディレクトリ間依存関係(再帰的なmakeでは提供されないもの)。
  • 移植性(パススタイルの問題の影響を受けずに、すべてを支配する1つのビルドチェーン)。
  • 実際のプログラミング言語(GNU make)よりも優れています)。
1
bltxd

最小限の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)
0
Bob Smith

基本的な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の例があります。お役に立てば幸いです。

0
Jay

デバッグオプション付きのSConstruct:

env = Environment()

if ARGUMENTS.get('debug', 0):
    env.Append(CCFLAGS = ' -g')

env.Program( source = "template.cpp" )
0
RichieHH

フロリンは良い出発点を持っています。私はgnuautoconfが好きではなかったので、そこから始めて概念をさらに進め、MagicMakefileと呼びました。シンプルなものからより複雑なものまで、3つのバージョンがあります。最新のものは現在githubにあります: https://github.com/jdkoftinoff/magicmake

基本的に、プロジェクトのソースファイルの標準レイアウトがあることを前提とし、ワイルドカード関数を使用してメイクファイルルールをその場で作成し、評価し、ヘッダーファイルの依存関係を処理し、クロスコンパイル、単体テスト、インストール、およびパッケージング。

[編集]この時点で、多くのビルドシステムに役立つプロジェクトファイルが生成されるため、すべてのプロジェクトにcmakeを使用しています。

ジェフ・コフティノフ

0
jdkoftinoff