Что такое эффективный рабочий процесс с C?- Makefile + скрипт bash - PullRequest
3 голосов
/ 02 сентября 2010

Я работаю над одним из моих первых проектов, который будет охватывать более одного файла C.Для моей первой пары тренировочных программ я просто написал свой код на main.c и скомпилировал с использованием gcc main.c -o main.Это сработало для меня, когда я учился.

Теперь я работаю над гораздо большим проектом самостоятельно.Я хочу продолжить сборку самостоятельно (или, по крайней мере, вручную), чтобы я мог понять процесс.Прочитав немного, я решил создать Makefile.

Примечание: я также использую GTK +, поэтому мне пришлось посмотреть, как добавить это в команду компиляции.

Этокак это выглядит после небольшого исследования:

main:
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0`

Сначала я просто запускал команду "make".Затем у меня возникли некоторые проблемы с получением сообщения об ошибке «главное обновление», даже если я изменил файл.

Поэтому я написал скрипт:

#!/bin/bash
rm main
make
./main

Поэтому я делаю изменения,и затем я запускаю этот скрипт.

Это хорошая / нормальная система?Я хочу иметь масштабируемую систему, так как мой проект будет расти.Я предполагаю, что могу сохранить этот скрипт и просто добавить зависимости в make-файл и изменить основную команду compile в make-файле.Я прав?

Спасибо заранее.

РЕДАКТИРОВАТЬ:

Спасибо за отзыв о том, как исправить мой Makefile.

Каков типичный процесс компиляции 1) типа make, затем 2) ./main независимо от того, как настроен проект или его размера (если вы написали правильный make-файл)?

Ответы [ 3 ]

10 голосов
/ 02 сентября 2010

Вы должны указать make, что main зависит от main.c. Таким образом, каждый раз, когда вы вносите изменения в main.c и затем запускаете make, main регенерируется. Для удаления main у вас может быть фальшивая цель с именем clean как:

main:main.c
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0`

.PHONY: clean
clean:
    rm -f main

Теперь для удаления main вы можете сделать: make clean

Если вы получаете make: main is up to date. Это означает, что вы не изменили main.c и, следовательно, нет необходимости в регенерации main. Но если вам придется принудительно восстанавливать main, даже если зависимости не были обновлены, вы также можете использовать параметр -B, равный make, как предложено Sjoerd в другом ответе.

3 голосов
/ 02 сентября 2010

Я нахожу, что командной строки make вполне достаточно для моих нужд, но написание Makefiles от руки становится довольно трудоемким делом.По мере усложнения вашего проекта вы обнаружите, что управление зависимостями вручную становится все более и более раздражающим.Я предлагаю вам научиться выполнять хотя бы одно из следующих действий:

  • Написать отслеживание зависимостей Makefile, позвонив, например, gcc -M.
  • Научитьсяиспользуйте генератор Makefile, например automake или CMake.Я лично предпочитаю automake, потому что он более зрелый (и не делает глупостей, таких как попытка поместить разделенные точкой с запятой списки в командной строке).
3 голосов
/ 02 сентября 2010
  • Используйте make -B или make --always-make для компиляции, даже если цель актуальна
  • Добавьте имена файлов после двоеточия, чтобы проверить, обновляются ли они.

Пример:

a: a.c
        gcc -o a a.c

a будет построен, только если a.c новее, чем a.

...