2016-11-12 2 views
0

У меня проблема с makefile для проекта с subdir. Дерево проекта реж является продолжением:Makefile подкаталог рекурсивный

project 
├── Makefile 
├── main.cpp 
| 
├── lib1 
│ ├── lib1.cpp 
│   ├── lib1.h 
│   └── Makefile 
| 
├── lib2 
│   ├── Makefile 
│   ├── lib2_1.cpp 
│   ├── lib2_1.h 
| ├── lib2_2.cpp 
│   └── lib2_2.h 
| 
├── lib3 
│   ├── Makefile 
│   ├── lib3.cpp 
│   └── lib3.h 

Makefile, каждой подпапке (lib1, lib2 ...), как это:

SRC_DIR = ./ 
BUILD_DIR = ./obj/ 

DEPS = lib1.o 

all: $(BUILD_DIR)$(DEPS) 

$(BUILD_DIR)%.o: $(SRC_DIR)%.cpp $(SRC_DIR)%.h 
    mkdir -p $(BUILD_DIR) 
    g++ --std=c++11 $< -c -o [email protected] 

clean: 
    rm -fr $(BUILD_DIR) 

Моя проблема заключается в: Как создать макияж файл, который находится в каталоге проекта, или make-файл «root»? Я не могу создать make-файл, который рекурсивно выполняет make-файлы в подкаталогах, и который связывает все объектные файлы в каталоге obj каждого поддира.

Вы можете мне помочь? Пожалуйста

+0

Просто комментарий, который не решит вашу проблему. Или может быть? ;) IMHO, каждый субдир должен иметь архив/цель, а не цель lib1.o. –

+0

Почему у каждого субдира должна быть такая цель? –

+0

архив/так, выберите один. Я не знаю, что вы пытаетесь построить, но ваши каталоги называются lib [123], поэтому я предполагаю, что вы создаете библиотеки. –

ответ

0

Я хотел бы сделать это следующим образом:

SUBDIRS = lib1 lib2 lib3 

main: main.cpp $(SUBDIRS) 
     $(CC) $(CFLAGS) $(LDFLAGS) -o [email protected] $< $(wildcard $(addsuffix /obj/*.o,$(SUBDIRS))) $(LDLIBS) 

.PHONY: $(SUBDIRS) 
$(SUBDIRS): 
     $(MAKE) -C [email protected] 

Хорошая вещь об этом: он будет работать должным образом с make -jN для параллельной сборки, и вы можете запустить make lib1 и т.д., если вы просто хотите, чтобы построить один подкаталог.

Плохая вещь об этом: она будет перенаправлять программу main каждый раз, когда вы запускаете make, даже если ничего не изменилось.

Если вы хотите избежать плохого, вы, вероятно, захотите рассмотреть возможность использования нерекурсивных make-файлов, которые потребуют перезаписи ваших файлов-файлов.

Если вы хотите создать единую статическую библиотеку для каждого подкаталога, названного в честь каталога (так, liblib1.a и т. Д.) Вместо связывания всех самих объектных файлов, вы, вероятно, можете заставить его работать с рекурсивными make-файлами. Хитрость заключается в том, что корневой файл makefile должен иметь возможность вывести или вычислить имена библиотек сами по себе. Он не может использовать wildcard и т. Д., Чтобы найти их.

+0

спасибо, отлично работайте! –