如何在Makefile中添加额外的源文件

3

我有一个Makefile,用于在Mac OS X上使用mpicc编译器构建可执行文件,链接mkl_lapack.h库。现在这个Makefile完美地工作,唯一的问题是如果我想编译链接其他.c文件的Eigenvalues.c时,不知道要添加什么内容。如果我想链接myfile.c,我应该在Makefile的哪里写它?

MKL_INCLUDE=/opt/intel/mkl/include
MKLROOT=/opt/intel/mkl/lib

CC = mpicc
LD = mpicc
IFLAGS = -I$(MKL_INCLUDE)
CFLAGS = -Wall -O2 $(IFLAGS) -std=c99

LFLAGS =  $(MKLROOT)/libmkl_intel_lp64.a $(MKLROOT)/libmkl_sequential.a    $(MKLROOT)/libmkl_core.a  -lpthread -lm 

PROGRAMS = Eigenvalues

all: $(PROGRAMS)

Eigenvalues: 
    $(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) 

%.o: %.c
    @echo C compiling $@
    $(CC) -c $(CFLAGS) -o $@ $<

clean:
    rm -rf *.o $(PROGRAMS)

Eigenvalues: Eigenvalues.c

LFLAGS 是传递给 lex 的标志的传统名称,而 LDFLAGS 是传递给链接器的标志所使用的名称。请参见:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html - William Pursell
2个回答

4

只需将 Eigenvalues 目标依赖于构成应用程序的所有.o文件(而不是您所拥有的.c文件!)。传统上,这些对象的列表被放置在一个变量中:

PROGRAMS = Eigenvalues
Eigenvalues_OBJS = Eigenvalues.o foo.o bar.o #etc

all: $(PROGRAMS)

Eigenvalues: $(Eigenvalues_OBJS)
        $(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) 

# delete the "Eigenvalues: Eigenvalues.c" line,
# leave everything else as you have it

顺便提一下,由于您正在使用标准变量名 $(CC)$(CFLAGS),因此您可以完全省略 %.o:%.c 规则。Make 有一个内置规则实现相同的功能。

几乎标准的名称:-I(大写字母i)应该放在CPPFLAGS中,而-l(小写字母L)则属于LDFLAGS。 - William Pursell

1

试试这个,伙计!

PROGRAMS = Eigenvalues

MKL_INCLUDE=/opt/intel/mkl/include 
MKLROOT=/opt/intel/mkl/lib 

IFLAGS = -I$(MKL_INCLUDE) 
CFLAGS = -Wall -O2 $(IFLAGS) -std=c99 

LFLAGS =  $(MKLROOT)/libmkl_intel_lp64.a $(MKLROOT)/libmkl_sequential.a
$(MKLROOT)/libmkl_core.a  -lpthread -lm  


all: $(PROGRAMS).c

OBJS = \
Eigenvalues.o \
myfile.o\

##############################################################################
.SUFFIXES : .c .o

CC = mpicc 
LD = mpicc 
RM = rm -rf

$(PROGRAMS).c : $(OBJS)
    $(CC) $(CFLAGS) -o $@ $^ $(LFLAGS)  

clean: 
    $(RM) *.o $(OBJS) $(PROGRAMS) 

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接