C 如何在Makefile中添加其他源文件
我有一个Makefile,用于在MacOSX上构建可执行文件,使用mpicc编译器链接mkl_lapack.h库。 现在这个Makefile工作得很好,唯一的问题是,如果我想编译与其他.c文件链接的特征值.c,我不知道要添加什么,如果我想链接myfile.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
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是传递给链接器的标志的名称。见: