2011-01-12 14 views
8

複数の実行ファイルで使用される共通コード(たとえばhello.cpp)があります。私はそれをすべてを構築するために、単一のMakefileを使用しています:複数の実行ファイルのMakefileを簡略化するための手助け

EXE=app1.out app2.out 
SRC=hello.cpp 
OBJ=$(SRC:.cpp=.o) 
SRC_MAIN=app1.cpp app2.cpp 
OBJ_MAIN=$(SRC_MAIN:.cpp=.o) 
all: $(EXE)  
app1.out: app1.o $(OBJ) 
    g++ $< $(OBJ) -o [email protected]  
app2.out: app2.o $(OBJ) 
    g++ $< $(OBJ) -o [email protected]  
.cpp.o: 
    g++ -c $< -o [email protected]  
clean: 
    rm -f $(EXE) $(OBJ) $(OBJ_MAIN) 

私は、各実行可能ファイルの個別の目標を持っていることについては非常に満足していない - ターゲットは基本的に同じです。すべての実行可能ファイルに対して1つのターゲットでこれを行う方法はありますか?私はこのような何かがうまくいくことを期待していた:

EXE=app1.out app2.out 
SRC=hello.cpp 
OBJ=$(SRC:.cpp=.o) 
SRC_MAIN=app1.cpp app2.cpp 
OBJ_MAIN=$(SRC_MAIN:.cpp=.o) 
all: $(EXE) 
.o.out: $(OBJ) 
    g++ $< $(OBJ) -o [email protected] 
.cpp.o: 
    g++ -c $< -o [email protected] 
clean: 
    rm -f $(EXE) $(OBJ) $(OBJ_MAIN) 

しかし、私はリンクエラーを取得する:

[email protected]:~/cpp/stack$ make -f Makefile2 
g++ -c app1.cpp -o app1.o 
g++ app1.o hello.o -o app1.out 
g++: hello.o: No such file or directory 
make: *** [app1.out] Error 1 
rm app1.o 

を、その依存関係hello.oを構築することなく、app1.outを構築しようとするいくつかの理由。なぜこれがうまくいかないのか誰も説明できますか?

ここでは、ダミーコードの残りの部分について説明します。

app1.cpp:

#include "hello.h" 
int 
main(void) 
{ 
    print_hello(); 
} 

app2.cpp:

#include "hello.h"  
int 
main(void) 
{ 
    for (int i = 0; i < 4; ++i) 
     print_hello(); 
    return 0; 
} 

HELLO.CPP:

#include "hello.h"  
#include <stdio.h>  
void 
print_hello() 
{ 
    printf("hello world!\n"); 
} 

hello.h:

#ifndef HELLO_H 
#define HELLO_H 
void 
print_hello(); 
#endif 

答えて

4

古いスタイルのサフィックスルールを使用しているように見えます。

Suffix rules cannot have any prerequisites of their own. If they have any, they are treated as normal files with funny names, not as suffix rules. Thus, the rule:

.c.o: foo.h 
      $(CC) -c $(CFLAGS) $(CPPFLAGS) -o [email protected] $< 

tells how to make the file '.c.o' from the prerequisite file 'foo.h', and is not at all like the pattern rule:

%.o: %.c foo.h 
      $(CC) -c $(CFLAGS) $(CPPFLAGS) -o [email protected] $< 

which tells how to make '.o' files from '.c' files, and makes all '.o' files using this pattern rule also depend on 'foo.h'.

ソリューションは、新しいスタイルのパターンルールを使用することです::; make

%.out: %.o $(OBJ) 
    g++ $< $(OBJ) -o [email protected] 
%.o: %.cpp 
    g++ -c $< -o [email protected] 

(また、あなたが.oのルールに.cppファイルを定義する必要はありませんのでご注意作る情報から、実際のデフォルト値はあります)

+0

ご回答ありがとうございます。カスタムの 'CPPFLAGS'をコンパイラに提供するために.cppを.oルールに使用します。私は物事を簡単に保っていたので、サンプルコードにそれらを表示しませんでした。デフォルトの変数名に '' CFLAGS''、 '' CPPFLAGS''、 '' LDFLAGS''などのデフォルトの変数名が含まれていますか? – misha

+1

はい、 'CPPFLAGS'はCのプリプロセッサ用です。 'CXXFLAGS'はC++フラグです。 –

関連する問題