我有一个Makefile,用于构建几个不同的程序。这些程序使用通用目标文件。
当一个程序与其链接的模块之一与任何优化一起编译时,一个程序与*** buffer overflow detected ***
崩溃。
这是Makefile:
CC=gcc
WFLAGS=-W \
-Wall \
-Werror \
-Wextra \
-Wshadow \
-Wcast-qual \
-Wcast-align \
-Wwrite-strings \
-Wpointer-arith \
-Wnested-externs \
-Wstrict-prototypes \
-Wmissing-prototypes
CFLAGS=$(WFLAGS) \
-g \
-O2 \
-ansi \
-pedantic \
-Dinline= \
-fno-common \
-fshort-enums
LFLAGS=-lm
TARGETS=lzdata \
lzmcro \
mknlrescs \
mknrescs \
levels \
degen
OBJ1=couplings.o \
crossing.o \
element.o \
lzdata.o \
utils.o \
lzcxs.o \
nist.o
OBJ2=lzmcro.o
OBJ3=mknlrescs.o \
csheader.o \
xsection.o \
labels.o \
csdata.o \
utils.o
OBJ4=mknrescs.o \
csheader.o \
xsection.o \
labels.o \
csdata.o \
utils.o
OBJ5=levels.o \
utils.o
OBJ6=degen.o \
utils.o \
nist.o
OBJECTS=$(OBJ1) $(OBJ2) $(OBJ3) $(OBJ4) $(OBJ5) $(OBJ6)
SOURCES=mknlrescs.c \
couplings.c \
mknrescs.c \
xsection.c \
crossing.c \
csheader.c \
element.c \
csdata.c \
labels.c \
lzmcro.c \
lzdata.c \
levels.c \
degen.c \
utils.c \
lzcxs.c \
nist.c
HEADERS=couplings.h \
xsection.h \
csheader.h \
crossing.h \
element.h \
csdata.h \
labels.h \
utils.h \
lzcxs.h \
nist.h
MANPAGES=lzdata.1\
lzmcro.1
SCRIPTS=mclz.sh \
fnist1.pl \
fnist2.pl
DATAFILES=elements.dat
ALL=$(SOURCES) $(HEADERS) $(MANPAGES) $(SCRIPTS) $(DATAFILES)
all: $(TARGETS)
levels: $(OBJ5)
$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^
degen: $(OBJ6)
$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^
mknlrescs: $(OBJ3)
$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^
mknrescs: $(OBJ4)
$(CC) $(CFLAGS) $(LFLAGS) -o $@ $^
lzmcro: $(OBJ2)
$(CC) $(CFLAGS) -o $@ $< $(LFLAGS)
lzdata: $(OBJ1)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS)
%.o: %.c %.h
$(CC) $(CFLAGS) -c $<
install: $(TARGETS)
mv $^ /usr/local/bin
clean:
@rm -f $(OBJECTS) $(TARGETS)
使用优化编译mknrescs
时,崩溃的程序为labels.c
。
我可以从-O2
宏中移除CFLAGS
,但我不愿意,因为有些程序需要一段时间,这会使它们更慢。
我可以单独构建每个对象,而不是使用此规则:%.o: %.c %.h
。
使用labels.o
的其他程序不会崩溃,即使它是使用优化编译的。
那么,我必须构建其他选项labels.o
仅在链接到mknrescs
时没有优化?
由于
答案 0 :(得分:2)
您可以为labels.o
添加特定于目标的变量,以覆盖CFLAGS
设置:
labels.o: CFLAGS = $(WFLAGS) -g -O0 -ansi -pedantic -Dinline= -fno-common -fshort-enums
此变量将应用于构建labels.o
的所有规则,因此它将在没有优化的情况下构建。但是,由于所有程序目标共享相同的目标文件,因此它们都使用非优化版本。您可以通过将优化级别从CFLAGS
var:
OPTLEVEL=2
CFLAGS=$(WFLAGS) \
-g \
-O$(OPTLEVEL) \
-ansi \
-pedantic \
-Dinline= \
-fno-common \
-fshort-enums
labels.o: OPTLEVEL = 0
如果您确实必须仅为一个程序而非其他程序使用非优化版本,则需要为目标文件使用不同的名称。您可以添加通用规则来生成未优化的对象:
%-noopt.o: %.c %.h
$(CC) $(CFLAGS_NOOPT) -c -o $@ $<
将CFLAGS_NOOPT
变量定义为CFLAGS
但与-O0
相同,然后将问题二进制文件的OBJ
列表更改为包含labels-noopt.o
而不是labels.o
{{1}}