Makefile для всех файлов

Как я могу написать makefile для моей структуры:

/ --
   /bin
   /out
   /src --
        /dir1
        /dir2
        ...
        /dirN
   main.cpp

Я хочу:

  • Скомпилировать все файлы из каталога /src
  • Все файлы .out в /out, без структуры каталога src
  • Скомпилируйте main.cpp со всеми файлами .out

У меня есть файлы .c и .cpp для компиляции и компоновки.

Я пробовал:

${OBJ_DIR}/%.o: $(SRC_DIR)/%.cpp
    $(CXX) -c $< -o $@ ${CFLAGS}

Но теперь я не знаю, как я могу сделать правило all...

+4
источник поделиться
1 ответ

Вот файл Makefile, который я использую во многих проектах:

# Compiler
CC   = g++
OPTS = -std=c++11

# Project name
PROJECT = foo_example_program

# Libraries
LIBS = -lpthread
INCS = -I./src/include

SRCS = $(shell find src -name '*.cpp')
DIRS = $(shell find src -type d | sed 's/src/./g' ) 
OBJS = $(patsubst src/%.cpp,out/%.o,$(SRCS))

# Targets
$(PROJECT): buildrepo $(OBJS)
    $(CC) $(OPTS) $(OBJS) $(LIBS) $(INCS) -o $@

out/%.o: src/%.cpp
    $(CC) $(OPTS) -c $< $(INCS) -o $@

clean:
    rm $(PROJECT) out -Rf

buildrepo:
    mkdir -p out
    for dir in $(DIRS); do mkdir -p out/$$dir; done

ПРИМЕЧАНИЕ. Возвращаясь назад, я помню, почему я реплицировал структуру каталогов src - то есть, если два файла были названы одинаковыми в нескольких каталогах, они перезаписывали друг друга. Одним из решений этого было бы добавить некоторый тип идентификатора для каждого объектного файла. Например, число в конце. Когда найден дубликат объектного файла, вы можете назвать объектные файлы "object.1.o" и "object.2.o" или что-то в этом роде.

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос