Я вижу, как вы получаете объектные (.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/
, но есть много избыточности, нет обработки зависимостей. Поэтому мы вводим предварительные условия, и, предполагая, что вы используете GNUMake (что вам следует), мы можем использовать Автоматические переменные (и я сокращу строку -I только для удобства чтения):
build/file1.o: src/file1.c
gcc -g -fPIC -c $< -I... -o $@
build/file2.o: src/file2.c
gcc -g -fPIC -c $< -I... -o $@
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core
Обратите внимание, что команды в правилах объекта теперь точно такие же. Таким образом, мы можем объединить эти два правила несколькими способами. Самое простое это:
build/file1.o: src/file1.c
build/file2.o: src/file2.c
build/file1.o build/file2.o:
gcc -g -fPIC -c $< -I... -o $@
Теперь еще один или два небольших изменения, и мы готовы идти:
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 $@
debug_build: $(OBJS)
gcc -shared -o bin/$(SHLIB).so $^ -lm -lpq -lmylib_core
Есть более изощренные трюки, но пока этого должно быть достаточно.