2013-03-15 3 views
0

Я работаю над проектом C, который содержит около 200 файлов .c и некоторые .h файлы. Не все из этих 200 файлов требуются в конечном продукте. В настоящее время необходимо скомпилировать около 180 файлов. У нас есть файл «compile_only_these.c», который включает в себя эти файлы размером 180 * .c, необходимые для проекта. Наш make-файл компилирует только этот файл вместо отдельных файлов .c.C Makefile для компиляции некоторых выборочных файлов

/* file: compile_only_these.c*/ 

#include "file1.c" 
#include "file2.c" 
. 
. 
. 
#include "file180.c" 

Но я считаю, что файлы .c - плохая идея. Поскольку каждый раз, когда я изменяю любой из этих файлов, все файлы скомпилируются снова.

Можете ли вы предложить лучший способ скомпилировать эти файлы.

Подробнее:

  • Все .c файлы находятся в одной папке «../project/src»
  • Я постоянно добавлять новые .c файлы, которые необходимы для компиляции. Я не хочу изменять Makefile каждый раз. Я добавляю новый файл.
  • Я все еще хочу сохранить эти 20 .c файлов, которые я сейчас не компилирую. Я могу использовать его в будущем. Удаление этих файлов, перемещая их в другой каталог не является решением
+0

ваш подход странный и не тот, который я когда-либо видел в производственном коде – Vorsprung

+0

@Vorsprung: Я согласен. Вот почему я планирую изменить этот подход. Кстати, это не было разработано мной. –

ответ

0

Что вам нужно, это переменная в Makefile, список необходимых объектных файлов, например:

OBJS := file1.o file2.o ... file180.o 

Вы можете Make построить его из compile_only_these.c файла, как это:

OBJS := $(shell sed -e '/\#include/!d' -e 's/\#include "\(.*\)\.c"/\1.o/' compile_only_these.c) 

ли Вам также нужна рука с правилом, которое использует эти объекты для создания конечного продукта?

0

Как уже упоминалось, это своего рода странным образом управлять проектом, но, учитывая то, что вы должны работать, вы можете попробовать что-то по этому подходу ...

CC = gcc 
OBJFILE = myprog 

# Tweak to match whatever you compile with normally 
CFLAGS = -O2 -Wall -std=c89 -pedantic 
LDFLAGS= # Extra flags here, for example -lm -pthread 

RM = rm -f 

SRCS = $(wildcard *.c) 
OBJS = $(SRCS:.c=.o) 

$(OBJFILE):$(OBJS) 
    $(CC) -o [email protected] $^ $(LDFLAGS) 


clean: 
    $(RM) core *~ $(OBJS) $(OBJFILE) 

Вы, очевидно, нужно отредактируйте путь (ы) для специфики вашей иерархии сборки, если вы хотите сделать больше в своем make, чем просто скомпилировать этот список файлов, но это общий подход для захвата всех файлов с подстановкой подстановочных знаков.

+0

Мой вопрос не в том, как скомпилировать несколько файлов. Я хочу скомпилировать выборочные файлы .c. вы можете объяснить, как решение ur помогает скомпилировать только нужные файлы, а не все файлы. –

+0

Извините, я сначала неправильно понял вопрос. Если единственная цель «лишних» файлов - сохранить их на случай, если они понадобятся позже, и вы не хотите переместить их в новую папку, чтобы отразить это, вы могли бы: a) сохранить список стилей в SRCS показанную выше, и поддерживайте это при добавлении/удалении имен файлов. b) переименуйте «дополнительные» .c-файлы на что-то вроде filename.c.saved (или выберите соглашение об именах), которое не позволяет им быть поднятым make. Вариант b) сделает добавление/удаление файла из сборки более сложным, чем переименование. –

Смежные вопросы