2013-02-01 8 views
14
GNU Make 3.82 
gcc 4.7.2 
c89 

にオブジェクトファイルを作成することができますガイド:は、私は、ファイルを作成し、次のしている特定のディレクトリ

INC_PATH=-I/home/dev_tools/apr/include/apr-1 
LIB_PATH=-L/home/dev_tools/apr/lib 
LIBS=-lapr-1 -laprutil-1 
RUNTIME_PATH=-Wl,-rpath,/home/dev_tools/apr/lib 
CC=gcc 
CFLAGS=-Wall -Wextra -g -m32 -O2 -D_DEBUG -D_THREAD_SAFE -D_REENTRANT -D_LARGEFILE64_SOURCE $(INC_PATH) 
SOURCES=$(wildcard src/*.c) 
OBJECTS=$(patsubst %.c, %.o, $(SOURCES)) 

EXECUTABLE=bin/to 

all: build $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(CFLAGS) -o [email protected] $(RUNTIME_PATH) $(OBJECTS) $(LIB_PATH) $(LIBS) 

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS) 

build: 
    @mkdir -p bin 

clean: 
    rm -rf $(EXECUTABLE) $(OBJECTS) bin 
    find . -name "*~" -exec rm {} \; 
    find . -name "*.o" -exec rm {} \; 

私のディレクトリ構造はこのproject/src project/binようなものです。私のMakefileはproject (root)フォルダにあり、すべての* .hと* .cはsrcディレクトリにあります。

SOURCES=$(wildcard src/*.c) 

オブジェクトファイル:私はすべてのソースファイルを取得するために、これを使用している

gcc: error: src/timeout.o: No such file or directory 

:現在、私は

が、私はこのエラーを取得する唯一のソース・ファイルと呼ばれるtimeout.cがあります。

OBJECTS=$(patsubst %.c, %.o, $(SOURCES)) 

ただし、makeはプロジェクトのルートフォルダにオブジェクトファイルを作成しているようですefileはです。それをsrcディレクトリに入れてはいけませんか?

答えて

12

あなたはこのルールでは二つの問題(だけでなく、3つ)持っている:あなたがまだ気づいていないが、ルールはすべて源に依存オブジェクトを作成し、構築しようとし

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS) 

をそうですね。ソースが1つしかない限り、問題はありません。 gccは、ソースファイル名から、それを推測しますので、出力ファイル名を指定していません。また

$(OBJECTS): src/%.o : src/%.c 
    $(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS) 

、コマンド(「$(CC)...」): static pattern rulean automatic variableで固定するのは簡単; src/timeout.cを指定すると、 timeout.o(作業ディレクトリには project/)が生成されます。したがって、出力ファイルへの望ましいパスを指定する必要があります。

$(OBJECTS): src/%.o : src/%.c 
    $(CC) $(CFLAGS) -c $< $(LIB_PATH) $(LIBS) -o [email protected] 
+0

共有ライブラリの作成はどうですか?私は共有ライブラリを作成するために '-c'スイッチが必要だと主張しているサイトを横断しましたが、これを使うと' -o'を使用できなくなりました。そして、現在、makeはルートプロジェクトディレクトリのオブジェクトファイルを作成しています。私のフォルダ構造は 'src/lib/*'です。objファイルを 'obj/lib/* 'に生成します。gccコマンドは' g ++ -std = C++ 11 -g -I./include -fPIC -Wall -c ./src/lib/Source1.cpp。/ src/lib/Source2.cpp' – krb686

+0

さて、私はそれを得ました。複数のソースに依存する複数のオブジェクトをコンパイルしようとしていました。私は静的パターンルールと自動変数 '$ <'と '$ @ 'で置き換えて、魅力的に動作します。 gccがなぜ文句を言うのか分かりませんし、 '-o'で' -c'を使うことはできないと言いますが、確かに可能です。 – krb686

4

出力ファイルを特定の場所に書き込むには、gcc-oオプションを使用します。たとえば、あなたが言うことができる:

$(CC) $(CFLAGS) -c $(SOURCES) $(LIB_PATH) $(LIBS) -o $(OBJECTS) 

は残念ながら、この回線に問題があります:$(SOURCES)で複数のソースファイルがある場合、それは動作しません、$(OBJECTS)も複数のファイル名が含まれているため、と-oオプションは、最初の引数にのみバインドされます。

ソースコードファイルのリストで各ファイルをコンパイルする方法は、暗黙のルールを使用することです。 gmakeでは、次のように記述します。

は、$ <は、入力ファイルの名前と $ @に置き換えられ
$(EXECUTABLE): $(OBJECTS) 
     $(CC) $(CFLAGS) -o [email protected] $(RUNTIME_PATH) $(OBJECTS) $(LIB_PATH) $(LIBS) 

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

は名前出て、出力ファイルに置き換えられます。

+2

これは、ソースが1つのみである限り動作します。 – Beta

+0

@Beta申し訳ありませんが、あなたが言っている「これ」は何ですか? – radical7

+0

あなたの解決策、「適切な方法」。複数のソースファイルで試してみると、私の言いたいことが分かります。 – Beta

関連する問題