複数の実行ファイルで使用される共通コード(たとえば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
ご回答ありがとうございます。カスタムの 'CPPFLAGS'をコンパイラに提供するために.cppを.oルールに使用します。私は物事を簡単に保っていたので、サンプルコードにそれらを表示しませんでした。デフォルトの変数名に '' CFLAGS''、 '' CPPFLAGS''、 '' LDFLAGS''などのデフォルトの変数名が含まれていますか? – misha
はい、 'CPPFLAGS'はCのプリプロセッサ用です。 'CXXFLAGS'はC++フラグです。 –