オブジェクト(.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
あり、より高度なトリックがあるが、それは今のところ十分でなければなりません。
私はどこから来ているのかわかりませんが、makefileを手作業で作る前に 'automake'を試してみてください。これはポータブルで*ユーザー*設定可能な方法でこのツリーの外のビルドをサポートします。 – thiton