Форум программистов, компьютерный форум, киберфорум
Наши страницы

С под Linux

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.63
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

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

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

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

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

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

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

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

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

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

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

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

Компиляция файлов с нестандартными расширениями GCC - C++ Linux
Можно ли такое провернуть и если да, то как? Например, я создал ассемблерные листинги: g++ -S example.cpp -o...

STM32 GCC размещение объектных файлов в RAM используя линкер - ARM
Переезжаю с Keil на System Workbench на базе Eclipse В старом проекте на Keil в файле линкера спокойно указывала размещение файлов в RAM ...

Подгрузка файлов с использованием пространства имен. Как сделать? - PHP
Сейчас обдумываю различные варианты организации системы, соответственно нужен автозагрузчик. Обычно просто подгружал основные файлы через...


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

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

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