Rechercher : dans
Par :

Makefile

Dernière réponse le 18 aoû 2006 à 14:23:37 pom, le 18 aoû 2006 à 12:11:04 
 Signaler ce message aux modérateurs

Bonjour, je ne sais pas trop où mettre mon message alors je le mets sur ce forum car mon programme est en C... J'ai un pb pour faire mon Makefile. Je désire paralléliser mon code et je ne sais pas trop où modifier mon Makefile. Pour compiler, je dois écrire la ligne suivante (en supposant que mon prgm n'est constitué que d'un seul fichier main.c) :

mpicc.mpich main.c -o out


(out est le nom de mon exécutable) et pour exéctuer mon code sur 10 machines je dois écrire

mpirun.mpich -np 10 out


Donc où dois modifier mon Makefile pour compiler et exécuter mon prgm ? Je vous envoie mon Makefile qui correspond à mon code séquentiel.

# inspire de http://gl.developpez.com/tutoriel/outil/makefile/

# compilateur utilise
CC=gcc #CPP pour le C++ et CC pour le C

CFLAGS=-Wall -W -O

LDFLAGS=-Wall -O2 -lm -static

# on inclut tous les headers
INCLUDE_DIR1=../include/includeCVode
INCLUDE_DIR2=../include/myinclude

# EXEC contient le nom des executables a generer.
EXEC=out

# Fichiers sources
SRC= $(wildcard ../source/sourceCVode/*.c) $(wildcard ../source/mysource/*.c) main.c

# Fichiers objets le .c est remplace par un .o
OBJ=$(SRC:.c=.o)

# Regles de compilation:
all: $(EXEC)

out: $(OBJ)
	@$(CC) -o $@ $^ $(LDFLAGS)

# Creation des .o a  partir des .c qui se verront appeles par defaut.
%.o: %.c
	@$(CC) -o $@ -c $< -I$(INCLUDE_DIR1) -I$(INCLUDE_DIR2) $(CFLAGS)

clean:
	@rm -rfv $(EXEC) $(OBJ) *~


Merci
Configuration: Susr Pro 9.3

Meilleures réponses pour « Makefile » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...

1

poof65, le 18 aoû 2006 à 12:35:01

Tu rajoutes
[tab]mpirun.mpich -np 10 out
en dessous de la ligne qui commence par all:

Pour compiler et exécuter il suffira de taper "make" --------------------------------------------------------
L'informatique est un long fleuve pas tranquille !!!

Répondre à poof65

2

pom, le 18 aoû 2006 à 13:10:41

OK, merci, je vais essayer ça.

Répondre à pom

3

pom, le 18 aoû 2006 à 13:37:00

Re salut, j'ai donc essayé ce que tu m'as dit. La compilation s'effectue très bien mais il y a un pb lors de l'exécution. J'ai le message d'erreur

main.o: In function `main':main.c:(.text+0xdb): undefined reference to `MPI_Init'
:main.c:(.text+0xe9): undefined reference to `ompi_mpi_comm_world'
:main.c:(.text+0xee): undefined reference to `MPI_Comm_rank'
:main.c:(.text+0xfc): undefined reference to `ompi_mpi_comm_world'
:main.c:(.text+0x101): undefined reference to `MPI_Comm_size'
:main.c:(.text+0x91f): undefined reference to `ompi_mpi_comm_world'
:main.c:(.text+0x924): undefined reference to `MPI_Barrier'
:main.c:(.text+0x929): undefined reference to `MPI_Finalize'
collect2: ld returned 1 exit status
make: *** [out] Error 1


La fonction MPI_Init est pourtant la toute première fonction à écrire (initialisation de l'environement MPI pour le calcul parallèle). J'ai bien mis mon #include "mpi.h" avant.
Ce qui est bizarre est que sur un prgm tout bête (envoi et réception d'un taleau) MPI_Init marche...

D'où pourrait provenir le problème ?
Merci.

Répondre à pom

4

Radek, le 18 aoû 2006 à 13:44:48

C'est au moment du link que ca plante ta compile. Donc tu as tout simplement oublié ta librarie MPI ou bien tu ne prends pas le bon compilo !

Répondre à Radek

5

poof65, le 18 aoû 2006 à 13:37:54

Ca c'est pas un problème d'exécution mais un problème de compilation, plus précisément un problème de linkage.

Tu n'auras pas oublié le chemin de la librairie MPI sur la ligne de compilation ?

Il y a aussi un problème dans ton makefile.
Tu n'indiques nulle part que tu génère l'exécutable out.
--------------------------------------------------------
L'informatique est un long fleuve pas tranquille !!!

Répondre à poof65

6

Radek, le 18 aoû 2006 à 13:44:48

Tu n'indiques nulle part que tu génère l'exécutable out.

Je ne vois pas ce que tu veux dire, son Makefile est correct. Enfin il me semble !!

Répondre à Radek

7

pom, le 18 aoû 2006 à 13:53:48

Re bonjour,
Tu n'indiques nulle part que tu génère l'exécutable out.
Je ne suis pas un roi du Makefile, alors c'est sûrement possible. En tout cas, le makefile que je vous ai envoyé (1e post) est correct (enfin... il marche).

Vous avez sûrement raison : je n'ai dit nul part le chemin de la librairie pour l'environnement MPI. Mais où dois-je le mettre dans le Makefile ? A quelle ligne ? Avec quelle syntaxe (en supposant que le chemin soit chemin/mpi) ?

Merci de votre patience

Répondre à pom

8

Radek, le 18 aoû 2006 à 14:03:50

Remplace ta ligne :

LDFLAGS=-Wall -O2 -lm -static

par
LDFLAGS=-Wall -O2 -lm -lmpi -static

Dans un premier temps et si il te dit qu'il ne trouve pas ta librairie rajoute le chemin avec l'option -L :
LDFLAGS=-Wall -O2 -lm -L/chemin/MPI -lmpi -static


Mais vérifi avant si tu doit vraiment compiler avec gcc !!!
Parce que selon les systèmes tu peux avoir des compilos prévus pour MPI (par exemple mpicc par exemple)
Tu es sous quel OS ?

Répondre à Radek

10

pom, le 18 aoû 2006 à 14:14:43

Oui effectivement, pour compiler je tape la commande

mpicc.mpich main.c -o out


dans le cas où je n'ai qu'un fichier main.c à compiler. Mais n'est-ce pas le compilateur gcc (version parallélisée) ? Dois-je remplacer ma ligne
CC=gcc


par

CC=mpicc


Merci encore.

Répondre à pom

9

Radek, le 18 aoû 2006 à 14:23:37

Un conseil : utilise la commande man.
man gcc
ou : man makefile
ou : man make
ou eventuellement : man gmake
...


C'est peut etre penible, mais tu en apprendras bien plus et tu retiendras mieux que si tu demande sans chercher par toi-même !
C'est un conseil pour pouvoir évoluer dans la programmation.
Maintenant si tu ne comprends pas certaines choses tu peux demander,
tu trouveras tjrs qq pour t'aider !
;-)

Bon courage pour ton debuggage en // !!
C'est pas facile tu veras !

Répondre à Radek

11

 pom, le 18 aoû 2006 à 14:17:19

Oui, tu as raison. J'ai appris le C "sur le terrain" (j'ai chopé sur le net plein de cours et je vais sur des forums). Pour le Makefile, j'ai aussi chopé des exemples sur le net. Maispour la programmation parallèle, je débute et suis un peu perdu...

Répondre à pom