0

我想制作一个带有 PATH 参数的模块化 makefile,但我不知道如何。

这是我之前的:

CC=
CFLAGS=-c -stack-protect
LDFLAGS=
SOURCES=
SSOURCES=
OBJECTS=$(SOURCES:.cpp=.o)
SOBJECTS=$(SSOURCES:.s=.o)
DEBUGFLAGS=-g -DDEBUG
EXECUTABLE=

all: CC += -DNDEBUG
all: $(SOURCES) $(SSOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) $(SOBJECTS)
        $(CC) $(LDFLAGS) $(OBJECTS) $(SOBJECTS) -o $@

.cpp.o:
        $(CC) $(CFLAGS) $< -o $@

.s.o:
        $(CC) $(CFLAGS) $< -o $@

debug: CFLAGS += $(DEBUGFLAGS)
debug: $(SOURCES) $(SSOURCES) $(LDFLAGS) $(EXECUTABLE)
        $(CC) $(LDFLAGS) $(OBJECTS) $(SOBJECTS) -o $(EXECUTABLE)

clean:
        rm -rf *o $(OBJECTS) $(SOBJECTS)

这就是我或多或少想做的事情:

PATH=
CC=
CFLAGS=-c -stack-protect
LDFLAGS=
SOURCES=./src1 ./src1
SSOURCES=./src1 ./src2
FSOURCES=$(SOURCES:./=$(PATH))
FSSOURCES=$(SSOURCES:./=$(PATH))
OBJECTS=$(SOURCES:.cpp=.o)
SOBJECTS=$(SSOURCES:.s=.o)
DEBUGFLAGS=-g -DDEBUG
EXECUTABLE=

all: CC += -DNDEBUG
all: $(FSOURCES) $(FSSOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) $(SOBJECTS)
        $(CC) $(LDFLAGS) $(OBJECTS) $(SOBJECTS) -o $@

.cpp.o:
        $(CC) $(CFLAGS) $< -o $@

.s.o:
        $(CC) $(CFLAGS) $< -o $@

debug: CFLAGS += $(DEBUGFLAGS)
debug: $(FSOURCES) $(FSSOURCES) $(LDFLAGS) $(EXECUTABLE)
        $(CC) $(LDFLAGS) $(OBJECTS) $(SOBJECTS) -o $(EXECUTABLE)

clean:
        rm -rf *o $(OBJECTS) $(SOBJECTS)

我怎样才能使这项工作?

4

1 回答 1

0

我假设您要制作的文件 .so 位于文件夹 src2 中,而您要构建和创建且可执行的文件位于文件夹 src1 中。

VPATH = src1:src2:objects:include:libs

CFLAGS= -I ./include -Wall -g -stack-protect

LDFLAGS = -lstdc++
# You can append more libs as required.

CC = gcc


target: $(patsubst ./src1/%.c,./objects/%.o,$(wildcard ./src1/*.c)) ./libs/libmylib.so  
    $(CC) $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) $(LDFLAGS) -L ./libs -lmylib -o target

./objects/%.o: ./src/%.c ./include/*.h 
    @mkdir -p ./objects
    $(CC) $(CFLAGS) -c $< -o $@

./libs/libmylib.so: ./src2/%.c ./include/*.h 
    @mkdir -p ./libs
    $(CC) $(CFLAGS) -c $< -o $@ 

对于 makefile 教程,您可以查看以下链接。 http://www.tune2wizard.com/linux-makefiles/

于 2013-08-31T12:13:56.697 回答