C 如何在Makefile中添加其他源文件

C 如何在Makefile中添加其他源文件,c,makefile,C,Makefile,我有一个Makefile,用于在MacOSX上构建可执行文件,使用mpicc编译器链接mkl_lapack.h库。 现在这个Makefile工作得很好,唯一的问题是,如果我想编译与其他.c文件链接的特征值.c,我不知道要添加什么,如果我想链接myfile.c,我必须在Makefile中写入它到哪里 MKL_INCLUDE=/opt/intel/mkl/include MKLROOT=/opt/intel/mkl/lib CC = mpicc LD = mpicc IFLAGS = -I$(MK

我有一个Makefile,用于在MacOSX上构建可执行文件,使用mpicc编译器链接mkl_lapack.h库。 现在这个Makefile工作得很好,唯一的问题是,如果我想编译与其他.c文件链接的特征值.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
MKL_INCLUDE=/opt/intel/MKL/INCLUDE
MKLROOT=/opt/intel/mkl/lib
CC=mpicc
LD=mpicc
IFLAGS=-I$(包括MKL)
CFLAGS=-Wall-O2$(IFLAGS)-std=c99
LFLAGS=$(MKLROOT)/libmkl_英特尔lp64.a$(MKLROOT)/libmkl_顺序.a$(MKLROOT)/libmkl_内核.a-lpthread-lm
程序=特征值
全部:$(程序)
特征值:
$(CC)$(CFLAGS)-o$@$^$(LFLAGS)
%.o:%.c
@echo C编译$@
$(CC)-c$(CFLAGS)-o$@$<
清洁:
rm-rf*.o$(课程)
特征值:特征值

只需让
特征值目标取决于构成应用程序的所有
.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有一个内置的规则,可以做同样的事情。

试试这个伴侣

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 $@ $<
程序=特征值
MKL_INCLUDE=/opt/intel/MKL/INCLUDE
MKLROOT=/opt/intel/mkl/lib
IFLAGS=-I$(包括MKL)
CFLAGS=-Wall-O2$(IFLAGS)-std=c99
LFLAGS=$(MKLROOT)/libmkl\u英特尔lp64.a$(MKLROOT)/libmkl\u顺序.a
$(MKLROOT)/libmkl_core.a-lpthread-lm
全部:$(程序).c
OBJS=\
特征值\
myfile.o\
##############################################################################
.后缀:.c.o
CC=mpicc
LD=mpicc
RM=RM-rf
$(程序).c:$(OBJS)
$(CC)$(CFLAGS)-o$@$^$(LFLAGS)
清洁:
$(RM)*.o$(OBJS)$(程序)
.c.o.:
$(CC)-c$(CFLAGS)-o$@$<

几乎是标准名称:-I(eye)应该放在CPPFLAGS中,-l(ell)应该放在LDFLAGS中。LFLAGS通常是传递给lex的标志的名称,而LDFLAGS是传递给链接器的标志的名称。见: