Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
1

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

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

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

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

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

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

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

5
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 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
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 17:53 3
Evg, спасибо за поясняющий пример.
но, просьба есть.. не мог бы ты привести еще и пример makefile`а который обходит указанные подкаталоги и подкаталоги находящие в текущем каталоге, и выполняет makefile`ы, которые лежат в каждом подкаталоге
т.е. получится два примера
буду очень признателен.
0
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 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
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.05.2011, 18:08 5
Цитата Сообщение от Evg Посмотреть сообщение
по результату исполнения правила нужно чтобы код ошибки возвращался
а как это сделать?
0
Evg
Эксперт CАвтор FAQ
21245 / 8261 / 636
Регистрация: 30.03.2009
Сообщений: 22,606
Записей в блоге: 30
08.05.2011, 18:11 6
Так же, как и на bash'е. Под рукой проверить не на чем

А вообще надо в каждом конкретном случае смотреть, чего ты хочешь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2011, 18:11
Помогаю со студенческими работами здесь

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

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

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

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

Make, makefile, simple makefile, hello_world
Всем привет! Разбираюсь с мэйк-файлами. Проблема следующая: не понятен сам принцип обработки...

Реализовать 2 функции с использованием языка C и конструкции asm компилятора gcc
формат binary16 стандарта IEEE 754-2008. В прототипах функций, приведённых ниже, обозначается как...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru