Marco Montalto
Marco Montalto

Reputation: 215

C++ Makefile. .o in different subdirectories

I have some problems trying to put .o files into a separate directory (/build). Actually, my sources (in /src) contain some subdirectories, and my Makefile only create the .o of the .cpp contained at the first "level". The other .o are just ignored, so, the target cannot be created. In my /src directory, I have "three levels" (src/first/second/). Here's the code of the Makefile :

CC=g++
CFLAGS=-W -Wall -ansi -pedantic -s -O3 -Os -std=c++11 -fpermissive
LDFLAGS= -lboost_system -lboost_regex

SRCDIR=src
HEADDIR=include
LIBDIR=build
BINDIR=bin

BIN=LTN
SRC = $(wildcard src/*.cpp src/*/*.cpp src/*/*/*.cpp)
OBJ = $(patsubst %.cpp,$(LIBDIR)/%.o,$(SRC))

all: $(BIN)

LTN: $(OBJ)
    $(CC) -o $(BINDIR)/$@ $^ $(LDFLAGS)

$(LIBDIR)/$(SRCDIR)/%.o: $(SRCDIR)/%.cpp $(HEADDIR)/%.h
    $(CC) -o $@ -c $< $(CFLAGS)

.PHONY = clean

Upvotes: 0

Views: 652

Answers (1)

edwardramsey
edwardramsey

Reputation: 363

You can try this:

CC=g++
CFLAGS=-W -Wall -ansi -pedantic -s -O3 -Os -std=c++11 -fpermissive
LDFLAGS= -lboost_system -lboost_regex

SRCDIR=src
HEADDIR=include
LIBDIR=build
BINDIR=bin

BIN=LTN
SRC=$(shell find . -name '*.cpp')
TMP=$(subst $(SRCDIR),$(LIBDIR), $(SRC))
OBJ=$(patsubst %.cpp,%.o,$(TMP))

all: $(BIN)

LTN: $(OBJ)
    @[ ! -d $(BINDIR) ] & mkdir -p $(BINDIR)
    $(CC) -o $(BINDIR)/$@ $^ $(LDFLAGS)

$(LIBDIR)/%.o: $(SRCDIR)/%.cpp  
    @[ ! -d $(dir $@) ] & mkdir -p $(dir $@)
    $(CC) -o $@ -c $< $(CFLAGS)

.PHONY = clean  

Upvotes: 1

Related Questions