3 votes

Comment ajouter des fichiers sources supplémentaires dans un Makefile

J'ai un Makefile que j'utilise pour construire un exécutable sur Mac OS X, en utilisant le compilateur mpicc, en liant la bibliothèque mkl_lapack.h. Maintenant, ce Makefile fonctionne parfaitement, le seul problème est que je ne sais pas quoi ajouter si je veux compiler Eigenvalues.c en liant d'autres fichiers .c, si je veux lier myfile.c où dois-je l'écrire dans le 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

4voto

Zack Points 44583

Simplement avoir la cible Eigenvalues dépendre de tous les fichiers .o (pas des fichiers .c, comme vous le faites!) qui composent l'application. Conventionnellement, la liste de ces objets est placée dans une variable:

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

all: $(PROGRAMS)

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

# supprimez la ligne "Eigenvalues: Eigenvalues.c",
# laissez tout le reste tel que vous l'avez

Au fait, puisque vous utilisez les noms de variables standard $(CC) et $(CFLAGS), vous pouvez omettre complètement la règle %.o: %.c; Make a une règle intégrée qui fait la même chose.

1voto

Christian Points 451

Essaie ça, mec!

PROGRAMS = Valeurs_propres

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 = \
Valeurs_propres.o \
monfichier.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 $@ $<

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X