4

Automake は初めてで、リンクせずにコンパイルしようとしています。私の目標は、Automake を使用して以下に示すような単純な Makefile を生成することです。

CFLAG = -Wall

build: Thread.o

Thread.o: Thread.cc Thread.h
    g++ $(CFLAG) -c Thread.cc

clean:
    rm -f *.o

これまでの試行で、次の Makefile.ac にたどり着きました。

noinst_PROGRAMS = thread

thread_SOURCES = Thread.cc

EXTRA_DIST= Thread.h

元の Makefile をシミュレートするにはどうすればよいですか?

4

4 に答える 4

2

Automake はオブジェクトを生成するようには設計されていません。プログラムまたはライブラリのいずれかをビルドします。単一のオブジェクト ファイルをコンパイルし、他のファイルをコンパイルしたくない理由を知らずに、質問に答えるのは困難です。あなたの「本当の」問題に対するより明確な答えがあるかもしれません。

Makefile.amあなたが書くことができるのは

noinst_LIBRARIES = libThread.a
libThread_a_SOURCES = Thread.cc Thread.h   # No need to put headers in EXTRA_DIST

ライブラリはオブジェクトファイルの単なるコレクションであり、リンクは含まれていないため、結果は, ansのみを含むMakefileライブラリを構築します。上記により、発行された に compile するルールが含まれるようになるため、必要に応じてルールを追加できます。libThread.alibThread.o*.aMakefile.amMakefilelibThread.obuild:

Automake にこのコンパイル ルールを発行させたいが、ライブラリをビルドさせたくない場合は、

EXTRA_LIBRARIES = libThread.a  # EXTRA here means "output build rules but don't
                               # build unless something depends on it".
libThread_a_SOURCES = Thread.cc Thread.h
build: Thread.$(OBJEXT)

これThread.$(OBJEXT)make build、元のMakefile.

(Automake は、DOS バリアントのような拡張機能をサポートするのでは.$(OBJEXT)なく、使用します。).o.obj

于 2009-06-15T16:33:10.900 に答える
0

まず、automake は Makefile を自動作成するツールです。make 自体はまったく別の獣です (そして、あなたが探していたのは make ソリューションだったと確信しています)。

これは、あなたが望むものを達成するための最も簡単なGNUベースのMakefileです:

all: Thread.o

これにより、(デフォルトで) 次のように入力されます (4 スペースの空白をハード タブに変更してください)。

all: Thread.o

Thread.o: Thread.cc
     $(COMPILE.cpp) $(OUTPUT_OPTION) $<

もちろん、COMPILE.cpp と OUTPUT_OPTION マクロはデフォルトで GNU make 指定された値に展開され、移植性がありません。$< は AT&T Make の標準構文ですが、 pmake(1) のマンページによると。

GNU make には、使用できる暗黙的ルールと明示的ルール、パターン、サフィックスなどの概念がありますが、これは make のすべてのバージョンに移植できるわけではありません。そのため、すべての Makefile は、ターゲットと変数に関して、 POSIX では、Makefile をどのように記述すべきかについて、望ましいシナリオの多くが説明されていません。

詳細については gmake -p を実行し、gmake の texinfo マニュアルで暗黙的、明示的なルール、パターン、サフィックスなどのトピックを参照してください。

于 2010-06-09T22:55:00.753 に答える