分别处理Makefile中的一个对象

时间:2014-05-28 15:10:46

标签: c makefile

我有一个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时没有优化?

由于

1 个答案:

答案 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}}