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

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

05.08.2009, 09:00. Просмотров 10185. Ответов 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 я скопировал себе код интерфейса в...

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

5
Evg
Эксперт CАвтор FAQ
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 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
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 17:53 3
Evg, спасибо за поясняющий пример.
но, просьба есть.. не мог бы ты привести еще и пример makefile`а который обходит указанные подкаталоги и подкаталоги находящие в текущем каталоге, и выполняет makefile`ы, которые лежат в каждом подкаталоге
т.е. получится два примера
буду очень признателен.
0
Evg
Эксперт CАвтор FAQ
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 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
Эксперт С++
3206 / 1455 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 18:08 5
Цитата Сообщение от Evg Посмотреть сообщение
по результату исполнения правила нужно чтобы код ошибки возвращался
а как это сделать?
0
Evg
Эксперт CАвтор FAQ
20297 / 7824 / 601
Регистрация: 30.03.2009
Сообщений: 21,852
Записей в блоге: 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

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

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

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


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

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

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