2012-07-02 4 views
0

У меня есть эта цель Makefile, который содержит следующие шаги:Clang ++ -c выводит файлы в том каталоге

... 
cd $(GRAPHICS_BUILD_DIR) 
clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp 
cd $(BASE_DIR) 
... 

По какой-то причине, Clang выводит файлы сборки в BASE_DIR, не GRAPHICS_BUILD_DIR. Все компилируется отлично, и когда я выполняю одну строку за раз вручную, она работает нормально, а файлы *.o выводятся в правильной директории.

Почему не следует помещать эти файлы в правильный каталог и как его заставить?

Я использую clang3.1 и текущую версию GNUMake на ядре Linux Ubuntu 3.2.0-26.

+0

Чтобы указать выходной файл, чтобы произвести можно передать '-o ...' флаг звоном. Например. 'clang ++ -c -I $ (SFML_HEADERS) $ (GRAPHICS_DIR)/$ (FILE) .cpp -o $ (GRAPHICS_BUILD_DIR)/$ (FILE) .o' Хотя мне кажется, что' cd'ing в выходной каталог в вашем скрипте должно быть указано, что файлы находятся в этом каталоге вывода по умолчанию. – bames53

+0

@ bames53: Я не могу передать флаг -o, потому что я компилирую несколько файлов. – jepugs

+0

Да, поэтому я не ответил на это. Вы, вероятно, не должны так строить. Обычно make-файлы имеют библиотеки и исполняемые объекты, которые явно перечисляют, на каких объектных файлах они зависят, а затем существует общее правило для создания объектного файла. Помимо всего прочего, это позволяет быстро восстанавливать части на основе графика зависимостей и позволяет явно указывать выходной файл с флагом '-o'. – bames53

ответ

3

Проблема в том, что в правиле «Сделать» каждая команда выполняется в своей собственной подоболочке; ничто не запоминается с одной строки на другую. Итак, ваша первая команда начинается с $(BASE_DIR), перемещается в $(GRAPHICS_BUILD_DIR) и умирает. Ваша вторая команда начинается с $(BASE_DIR) и запускает там Clang.

Попробуйте это:

... 
cd $(GRAPHICS_BUILD_DIR) ; clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp 
... 
Смежные вопросы