2012-01-08 24 views
4

手作りのmakeファイルは比較的新しいです。私はライブラリを構築するための基本的なmakeファイルをまとめました。すべての一時的な.oファイルをビルドディレクトリに保存し、ビルドされた実行可能ファイルをbinディレクトリに保存します。makeファイルにビルドディレクトリを指定する

私のディレクトリ構造は次のようになります。

root 
    src/ 
    include/ 
    build/ 
    bin/ 
    Makefile 

と、これは私のメイクファイルは次のようになります。

SHLIB = pg_extlib 

SRC = src/file1.c \ 
     src/file2.c 

OBJS = build/file1.o \ 
     build/file2.o 

debug_build: 
    gcc -g -fPIC -c $(SRC) -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude 
    gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core 


clean: 
    rm -f $(SHLIB) $(OBJS) 

.oファイルは、彼らはまた、buildフォルダに正しく配置されているが、ルートフォルダ(Makefileが存在する場所)に表示されます。これをどうやって解決するのですか?

+1

私はどこから来ているのかわかりませんが、makefileを手作業で作る前に 'automake'を試してみてください。これはポータブルで*ユーザー*設定可能な方法でこのツリーの外のビルドをサポートします。 – thiton

答えて

5

オブジェクト(.o)のファイルがルートフォルダにどのように表示されているのかは分かりますが、ビルドフォルダにどのように表示されているのかわかりません。

これを段階的に実行しましょう。まずオブジェクトファイルに独自のルールを与えます:

# Note the use of "-o ..." 
build/file1.o: 
    gcc -g -fPIC -c src/file1.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file1.o 

build/file2.o: 
    gcc -g -fPIC -c src/file2.c -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o build/file2.o 

debug_build: $(OBJS) 
    gcc -shared -o bin/$(SHLIB).so $(OBJS) -lm -lpq -lmylib_core 

これは効果的ですが、原油です。オブジェクトファイルは今やbuild/に入りますが、多くの冗長性があり、依存性の処理はありません。だから我々は前提条件に入れて、(あなたがすべき)、我々はAutomatic Variablesを使用することができます(と私は読みやすくするために、-I文字列を省略します)あなたはGNUMakeを使用していると仮定すると:

build/file1.o: src/file1.c 
    gcc -g -fPIC -c $< -I... -o [email protected] 

build/file2.o: src/file2.c 
    gcc -g -fPIC -c $< -I... -o [email protected] 

debug_build: $(OBJS) 
    gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core 

お知らせのコマンドことオブジェクトルールはまったく同じになりました。だから私たちはこれらの2つのルールを2つの異なる方法で組み合わせることができます。

build/file1.o: src/file1.c 
build/file2.o: src/file2.c 

build/file1.o build/file2.o: 
    gcc -g -fPIC -c $< -I... -o [email protected] 

今1つのまたは2以上の小さな調整と我々が行ってもいいです::最も単純である

build/file1.o: src/file1.c 
build/file2.o: src/file2.c 

build/file1.o build/file2.o: 
    gcc -g -fPIC -c $< -I`pg_config --includedir` -I`pg_config --includedir-server` -I/some/required/path/include -Iinclude -o [email protected] 

debug_build: $(OBJS) 
    gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core 

あり、より高度なトリックがあるが、それは今のところ十分でなければなりません。

関連する問題