25

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

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

t.cpp 番目

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

4

11 に答える 11

33

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

make t

そして、それは呼び出します

g++ t.cpp -o t

ディレクトリに Makefile さえ必要ありませんが、t.cpp と tc と 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 $<
于 2008-11-13T15:36:40.277 に答える
19

これは、私のコード スニペット ディレクトリからの一般的な makefile です。

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 つのバイナリを生成する .cpp ソースが 1 つある限り、それ以上は必要ありません。私は GNU make でのみ使用しており、依存関係の生成には gcc 構文 (icc でもサポートされています) を使用しています。SUN コンパイラを使用している場合は、「-MMD」を「-xMMD」に変更する必要があります。また、このコードを貼り付けたときに行頭のタブがclean:スペースに変更されていないことを確認しmakeてください。そうしないと、区切り文字が見つからないというエラーが発生します。

于 2008-11-13T15:52:34.253 に答える
7

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

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

Program("t.cpp")

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

scons

終わり!

于 2008-11-13T15:43:06.753 に答える
5

システム全体の設定が事前に構成されていないと仮定すると、次のようになり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
于 2008-11-13T15:44:00.370 に答える
1

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

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

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

omake

ボーナスとして、自動的に以下を取得します。

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

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

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

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

ジェフ・コフティノフ

于 2008-11-14T08:18:35.823 に答える
0

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

env = Environment()

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

env.Program( source = "template.cpp" )
于 2008-11-14T00:53:14.083 に答える
0

基本的な Makefile の作成に関する参考資料

http://en.wikipedia.org/wiki/Make_(ソフトウェア)

http://mrbook.org/tutorials/make/

http://www.opussoftware.com/tutorial/TutMakefile.htm

http://www.hsrl.rutgers.edu/ug/make_help.html

特に最初のカップルには、あなたが説明したような最小限のサンプル Makefile があります。それが役立つことを願っています。

于 2008-11-13T15:46:46.560 に答える
-1

autoconf が .h ファイルを ac ファイルと認識していることが問題の原因である場合は、名前を .hpp または .h++ に変更してみてください。

于 2008-11-13T15:45:06.530 に答える