С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/70: Рейтинг темы: голосов - 70, средняя оценка - 4.99
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

Makefile: как с использованием gcc строить автоматические зависимости от .h файлов?

05.08.2009, 09:00. Показов 13404. Ответов 5

Студворк — интернет-сервис помощи студентам
Как с использованием gcc строить автоматические зависимости от .h файлов (чтобы постоянно не менять Makefile при изменении структуры include'ов)?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2009, 09:00
Ответы с готовыми решениями:

Адаптация makefile Solaris под gcc
Доброго времени суток, форумчане! Столкнулся намедни с проблемой, которая намного превышает уровень моих познаний в gcc (и Solaris),...

[РЕШЕНО]GCC+makefile=вставить в *.bin дату компиляции?
Собственно вопрос в сабже. Просто вставить - не проблема, но вставляется в произвольное место и искать не удобно, а хотелось бы либо...

[РЕШЕНО]GCC+makefile=вставить в *.bin имя файла прошивки?
Отделил от времени и даты. По мейкфайлу происходит компиляция. Возможно ли? Если кто знает, поделитесь. Теперь последняя хотелка,...

5
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.08.2009, 10:44
Лучший ответ Сообщение было отмечено как решение

Решение

Нужно использовать опцию -MD, которая строит файл зависимостей, а потом эти файлы подключать из Makefile

C
1
2
/* Файл t.c */
#include "t.h"
C
1
/* Пустой файл t.h */
Code
1
2
3
4
5
$ gcc t.c -c -MD
$ ls t.*
t.c  t.d  t.h
$ cat t.d
t.o: t.c t.h
По опции -MD параллельно строится файл зависимостей t.d ("d" = "dependences"). Эта опция специально разработана для Makefile'ов. Подробнее объясню попозже. Либо сам поищи, как это делается

Добавлено через 1 час 25 минут 43 секунды
В общем, просто пишу твой случай без пояснений. Если что-то непонятно - спрашивай.

Такой способ с автоматическим подцеплением имеет некоторые побочные эффекты. Например, при удалении файла исходника придётся сделать "make clean", потому как останется старый файл с зависимостью. В общем когда добавляешь файлы, удаляешь, меняешь порядок работы в Makefile или просто есть подозрение, что ты поменял что-то, а перекомпиляция не прошла (в этом случае надо отдельноразбираться) - на всякий случай набирай "make clean".

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Принятые обозначения: CC - компилятор Си, CXX - компилятор Си++
CXX = g++
CXXFLAGS = -Wall
DFLAGS = -MD
LD = $(CXX)
LDFLAGS =
OFILES = debugger.o error_handler.o value_class.o variable_class.o function_class.o parser.o syntax_parser.o driver.o
RM = rm -f
TARGET = bsc
 
# По умолчанию прика "make" собирает самую первую цель.
# Обычно её обзывают "all" и уже расписывают, что там должно быть
all: $(TARGET)
 
# Линковка из объектников
$(TARGET): $(OFILES)
        $(LD) $(LDFLAGS) $(OFILES) -o $(TARGET)
 
# Подключаем файлы зависимостей
# Заумное выражение справа означает взять переменную OFILES и заменить ".o" на ".d"
# Т.е. здесь по сути написано "-include debugger.d error_handler.d ..."
# Директива include работает точно так же, как и препроцессорная #include
-include $(OFILES:.o=.d)
 
# Общее правило формирования объектника. $< означает левую часть зависимости, $@ - правую
%.o : %.cpp
        $(CXX) -c $(DFLAGS) $(CXXFLAGS) $< -o $@
 
clean:
        $(RM) $(TARGET) *.o *.d *.bak *~* core
13
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 17:53
Evg, спасибо за поясняющий пример.
но, просьба есть.. не мог бы ты привести еще и пример makefile`а который обходит указанные подкаталоги и подкаталоги находящие в текущем каталоге, и выполняет makefile`ы, которые лежат в каждом подкаталоге
т.е. получится два примера
буду очень признателен.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2011, 18:01
Можно по разному:

Code
1
2
3
4
5
6
7
all: rule_dir1 rule_dir2
 
rule_dir1:
        make -C dir1
 
rule_dir2:
        make -C dir2
или

Code
1
2
3
4
all:
        for d in dir1 dir2 ; do \
          make -C $d; \
        fi
В первом случае используем правила и в этом случае возможно распараллеливание: т.е. между двумя правилами нет явной зависимости и запуска в подкаталогах как бы можно запустить в параллель. Во втором случае всё будет строго последовательно. Только надо аккуратно проконтролировать, чтобы при ошибочном запуске в подкаталоге вся сборка сломалась (т.е. по результату исполнения правила нужно чтобы код ошибки возвращался, чего в моём примере нет)
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 18:08
Цитата Сообщение от Evg Посмотреть сообщение
по результату исполнения правила нужно чтобы код ошибки возвращался
а как это сделать?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2011, 18:11
Так же, как и на bash'е. Под рукой проверить не на чем

А вообще надо в каждом конкретном случае смотреть, чего ты хочешь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2011, 18:11
Помогаю со студенческими работами здесь

Можно ли как-то указать в Makefile, чтобы часть файлов компилировал компилятор C?
Я пробую программу Qt 4 Designer,и после всех настроек файла .ui я скопировал себе код интерфейса в программу,но она не компилируется-...

GCC Сборка 32 разрядной версии GCC 64 разрядным GCC
Доброго времени суток. Возникла необходимость под 32х разрядный Linux, собрать 32 разрядный GCC. Но на моей основной машине установлена 64...

Компиляция программы, состоящей из нескольких файлов. Makefile
Доброго времени суток, уважаемые форумчане! Есть GUI-программа, в которой в качестве экзампла сделано небольшое меню. Программа...

Напишите makefile, который осуществляет резервное копирование файлов
Напишите makefile, который осуществляет резервное копирование файлов. Вызывается при помощи make bckp, файлы копируются в директорию...

Написать Makefile с разделением бинарных и объектных файлов в разные каталоги
как написать маикфаил с разделением бинарных и объектных фаилов в отдельные каталоги. вот что у меня есть : Код: CC=gcc CFLAGS=-g2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru