Хотя есть довольно большие кривые обучения для Make, заставит файл является предпочтительным решением , В SO я также заметил значительное использование CMake.
Дополнительные идеи для вашего Makefile:
Следующие два правила управляют 90% моих простых модульных тестов исполняемым:
# pattern rule R01
# when any ARCHIVE changes, trigger a rebuild
% : %.cc %.hh $(LIB_ARCHIVEs)
@echo
@echo R01: $<
rm -f [email protected]
$(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)
# pattern rule R02
# when any ARCHIVE changes, trigger a rebuild
% : %.cc $(LIB_ARCHIVEs)
@echo
@echo R02: $<
rm -f [email protected]
$(CC) $(CC_FLAGS) $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)
Иногда я буду добавлять конкретные LIB имена и каталоги ... непосредственно к LIB_DIRs и определение LIB_NMs в Makefile. Например, здесь я добавил -lrt и -pthread:
LIB_NMs += -lbag_i686 -lposix_i686 -lrt -pthread
bag_i686 и posix_i686 являются библиотеки я построил ... простые обертки класса C++ вокруг Линукс и Posix функций. Большинство моих модульных тестов не используют большую часть статей, но я не испытываю печали, включая его.
С C++ std :: thread, я редко использую -pthread. Тем не менее, я иногда пользуюсь posix семафором.
Мой доступ к командной строке компиляции (в Emacs на Ubuntu) обеспечивает историю, поэтому случайные изменения или дополнения в командной строке только «заморачиваться» один раз. С этого момента новая команда доступна в истории.
В Emacs запускаю настроен с «встроенной» команды заранее определенной компиляции:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' -j 2 -k
Эта команда показывает до 1-й раз, когда я запустить компилятор изнутри Emacs. Emacs представляет его так, как будто команда уже находится в «истории компиляции команд».
я вручную сократить это, если я не восстанавливать все, как правило, я только построить единую ут:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64'
Так, например, когда я готов к компиляции dumy431.cc, я призываю:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='g++ -m64' dumy431
Следующая сборка, которую я запускаю (из компиляции emacs), начинается с предыдущей команды, а стрелка вверх/вниз перемещается по любой другой версии команды.
С помощью этой формы команды, я могу тривиальным изменить с г ++ звенеть ++, вставив «клан» в соответствующем месте:
USER_FLAGS='-O0 ' ; export USER_FLAGS ; time make CC='clang++ -m64'
лязг ++ часто обеспечивает дополнительную диагностику, что г ++ не сообщают. Чтобы вернуться к g ++, я могу увеличить стрелку на панели команд компилятора (или отредактировать команду).
Вот небольшой пример, когда мой модульный тестовый код содержит несколько файлов src. Часто, не-основные файлы (такие как. Eng_format *) являются код, который я планирую захватить один из моих библиотек для будущего использования:
FMssb.o : FMssb.cc FMssb.hh
@echo
@echo R_FMssb.o: $<
rm -f [email protected]
$(CC) $(CC_FLAGS) -c $< -o [email protected]
FMssb_ut : FMssb_ut.cc eng_format.o FMssb.o $(LIB_ARCHIVEs)
@echo
@echo R_FMssb_ut: $<
rm -f [email protected]
$(CC) $(CC_FLAGS) $< -o [email protected] eng_format.o FMssb.o $(LIB_DIRs) $(LIB_NMs)
eng_format.o : eng_format.cpp eng_format.hpp $(LIB_ARCHIVEs)
@echo
@echo R_EF: $<
rm -f [email protected]
$(CC) $(CC_FLAGS) -c $< -o [email protected] $(LIB_DIRs) $(LIB_NMs)
ли г ++ называть лязг компоновщик? –
Да, это работает, но я думаю, что лучший способ - создать файл make – sger
Поскольку вы уже знаете, что Makefile - это способ пойти, в чем проблема? –