Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/51: Рейтинг темы: голосов - 51, средняя оценка - 4.92
#pragma
Временно недоступен
956 / 227 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

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

05.08.2009, 09:00. Просмотров 10695. Ответов 5

Как с использованием gcc строить автоматические зависимости от .h файлов (чтобы постоянно не менять Makefile при изменении структуры include'ов)?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2009, 09:00
Ответы с готовыми решениями:

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

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

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

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

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

Решение

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

C
1
2
/* Файл t.c */
#include "t.h"
C
1
/* Пустой файл t.h */
Код
$ 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".

Код
# Принятые обозначения: 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
Эксперт С++
3207 / 1456 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 17:53 3
Evg, спасибо за поясняющий пример.
но, просьба есть.. не мог бы ты привести еще и пример makefile`а который обходит указанные подкаталоги и подкаталоги находящие в текущем каталоге, и выполняет makefile`ы, которые лежат в каждом подкаталоге
т.е. получится два примера
буду очень признателен.
0
Evg
Эксперт CАвтор FAQ
21090 / 8107 / 628
Регистрация: 30.03.2009
Сообщений: 22,440
Записей в блоге: 30
08.05.2011, 18:01 4
Можно по разному:

Код
all: rule_dir1 rule_dir2

rule_dir1:
        make -C dir1

rule_dir2:
        make -C dir2
или

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

А вообще надо в каждом конкретном случае смотреть, чего ты хочешь
0
08.05.2011, 18:11
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2011, 18:11

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

Написать Makefile с разделением бинарных и объектных файлов в разные каталоги
как написать маикфаил с разделением бинарных и объектных фаилов в отдельные каталоги. вот что у...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.