Compilation et Makefile

Discutez d'informatique ici !
melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

Compilation et Makefile

par melreg » 07 Juil 2009, 09:47

Bonjour,

Je me lance dans un projet de programmation un peu plus conséquent que tout ce que j'ai fait jusqu'à présent. Du coup, j'ai besoin de comprendre ce qui se cache derrière les .o, les options de compilations (-c, -o, ...). Jusqu'à maintenant, j'avais une recette de cuisine pour faire marcher un programme et cela me convenait...
Précisément, j'aimerais savoir si vous avez un "bon" site à me proposer pour comprendre:
- la compilation (je pense que ça ne dépend pas trop du langage ni du compilateur, mais si jamais pour moi c'est du fortran90 avec gfortran)
- les makefiles. J'ai déjà vu 2-3 tutoriels, mais ceux-ci présupposent une bonne connaissance du premier point...

Merci d'avance.

PS: Je sais que peut-être certains seront tenter de m'orienter vers google, mais le but de ce message est de voir si quelqu'un connaît de bonnes références, parce que sur le net, il y a beaucoup de choses...



melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 07 Juil 2009, 15:39

Bon, je crois que je vais préciser un peu mes soucis, ça sera plus facile de répondre...

Lors d'une règle

Code: Tout sélectionner
cible: dependances
         commandes


la cible est uniquement un mot clé pour permettre de mieux s'y retrouver?

Peut-être que d'autres questions plus précises suivront...

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 07 Juil 2009, 19:54

salut melreg,

ce site est pas mal (comme toujours chez developpez :) ) lien .
Concernant ta question, 2.1:makefile minimal
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 08 Juil 2009, 07:06

Merci pour ton lien. C'est vrai que ce site est pas mal. Par contre, je ne vois pas trop pour ma question... . Peut-être que je la repose autrement: est-ce qu'on pourrait imaginer une règle comme ça:

Code: Tout sélectionner
toto : papa_toto
        gfortran -o a.o b.o

papa_toto : ...


ou est-ce qu'il faut que toto, papa_toto, ... soient des fichiers.o ou des noms d'exécutables?

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 08 Juil 2009, 09:37

Nouvelle question:
Dans un makefile que j'ai récupéré (et qui me sera utile), il y a la ligne

Code: Tout sélectionner
LIBS= -L/Users/moi/ARPACK -larpack -Wl,-framework -Wl,vecLib


Cela signifie quoi exactement? le "-L" au début du chemin d'accès me paraît bizarre. Et sinon, je ne comprends pas trop les options à la fin. De plus, je ne vois pas de $(LIBS) plus loin dans les règles...

C'est assez flou là

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 08 Juil 2009, 18:33

re,
toto : papa_toto gfortran -o a.o b.o papa_toto : ...
ou est-ce qu'il faut que toto, papa_toto, ... soient des fichiers.o ou des noms d'exécutables?


cf 2.2 enrichi

clean:
rm -rf *.o

mrproper: clean
rm -rf hello

mrproper appel clean, qui va supprimer tous les .o, puis supprimer lexe hello (ou le dossier). T'en déduis que les dépendances/cibles sont pas forcément des fichiers, plus des "alias".

LIBS= -L/Users/moi/ARPACK -larpack -Wl,-framework -Wl,vecLib

de mémoire, -L c'est pour le path, et -l pour le fichier.
ce qu'il y a apres, aucune idée.
Normalement, tu utilises $(LIBS) lors de la commande de compilation avec les .o

qqch du style :
EDL = gfortran
OBJS = a.o b.o
EXE = nomDeLexe
LIBS= -L/Users/moi/ARPACK -larpack -Wl,-framework -Wl,vecLib

$(EDL) $(OBJS) -LcheminDeMaLib -lmaLibStatique -o $(EXE) $(LIBS)

les libs de LIBS etant normalement des lib dynamiques
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 09 Juil 2009, 08:13

Merci fatal_error.

C'est vrai que j'aurais du remarquer que le nom des cibles et dépendances sont plutôt des alias... désolé !

Sinon, je trouve ça bizarre que le $(LIBS)$ n'apparaît pas... je vais me renseigner.

Sinon, je ne sais pas si tu peux me répondre concernant les librairies linpack, lapack et arpack. J'ai téléchargé les paquets suivants:

libblas-dev
libblas3gf

liblapack-dev
liblapack3gf

libarpack2
libarpack2-dev
libarpack2-dbg

En fait, je ne sais pas comment les utiliser. Par exemple, je sais qu'il existe une "subroutine" dpbtrf (pour la décompostion de cholesky) dans lapack. Mais comment faire pour l'utiliser? C'est justement dans le makefile qu'il faut préciser? Si oui, comment?

Merci d'avance!

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 09 Juil 2009, 10:48

re,

alors pour chacune de ces librairies, ya moyen que tu les retrouves dans /usr/lib/
Jor : cd /usr/lib; ls | grep linpack
Ensuite, tu choppes la liblinpack.so.0. (le nom qui s'en rapproche)
Dans ton makefile, tu auras la lib liblinpack a rentrer (sans le .so.0), en tant que lib dynamique.

effectivement, c'est curieux que $(LIBS) n'apparaisse pas. Ca devrait.

Du coup, avec cette lib precompilée, tu devrais avoir acces aux "subroutines" /fonctions quelle contient.
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 07:25

Ok, alors si je comprends bien, si j'entre dans mon makefile qqch comme

Code: Tout sélectionner
EDL = gfortran
OBJS = a.o b.o
EXE = nomDeLexe
LIBS= /Usr/lib/liblapack

$(EDL) $(OBJS) -LcheminDeMaLib -lmaLibStatique -o $(EXE) $(LIBS)


cela signifie que dans a.f90 et b.f90, je peux écrire

Code: Tout sélectionner
call une_procedure_de_liblapack


sans problème?

Par ailleurs, dans usr/lib/ j'ai les fichiers (pour respectivement lapack, linpack et arpack je pense):

liblapack.so
liblapack.so.3gf
liblapack.so.3gf.0

libblas-3gf.so
libblas.so
libblas.so.3gf.0

libarpack.so.2.1
libarpack.so
libarpack.so.2

C'est un de ces fichiers qu'il faut que je mette dans

LIBS= /Usr/lib/liblapack.so.3gf

Code: Tout sélectionner
$(EDL) $(OBJS) -LcheminDeMaLib -lmaLibStatique -o $(EXE) $(LIBS)


Merci à toi et désolé d'être un peu lent à comrendre tout ça...

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Juil 2009, 07:36

Merci à toi et désolé d'être un peu lent à comrendre tout ça..

Pas de soucis, j'en ai aussi chié pour mon premier makefile, ca me fait plaisir de pouvoir aider a mon tour.

LIBS= /Usr/lib/liblapack

Je ne sais pas si ca marche. Par défaut, je tenterais plutot :
LIBS =-llapack -larpack -lblas

Je connais pas le fortran, mais normalement, dans ton entete de fichier, tu inclues le nom de ta librairie genre :
include si tu etais en C++ puis tu peux utiliser une des fonctions contenues mettons cout :
std::cout.
Dans ton cas, si
call une_procedure_de_liblapack
est un appel de procédure, il faut que tu aies (je pense) auparavant inclut ta librairie avant.
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 08:27

Je pensais aussi qu'il fallait une ligne qui indique que je fais appel à une librairie (genre include ...). Mais dans le projet que je reprends, il n'y en a pas. Et je n'ai jamais eu recours à des librairies jusqu'à maintenant... . Je vais regarder de mon côté, ça risque de prendre un peu de temps... .

Encore merci.

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 09:57

Me revoilà plus vite que prévu...

J'ai fait un petit programme "d'essai" utilisant une procédure de lapack (je ne sais pas exactement quel lapack, il y a plusieurs noms qui pourrait jouer dans le dossier /usr/lib, comme liblapack.a, liblapack.so, liblapackgf-3.so, ...).

Voilà mon la ligne définissant la librairie dans mon make file:

Code: Tout sélectionner
LIBS = -L/usr/lib/ -llapack


Voici l'erreur que je reçois:
Code: Tout sélectionner
gfortran -o essai.o appel.o matrice.o vecteur.o -L/usr/lib/ -llapack
/usr/lib/gcc/i486-linux-gnu/4.3.3/libgfortranbegin.a(fmain.o): In function `main':
(.text+0x35): undefined reference to `MAIN__'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [essai] Erreur 1


Pourtant, je n'ai pas de fonction main!

Remarque: si j'enlève "$(LIBS)" dans la ligne de compilation/linkage (ce qui n'est pas le bon plan, mais c'est pour comparer l'erreur), j'obtiens:
Code: Tout sélectionner
gfortran -o essai.o appel.o matrice.o vecteur.o # -L/usr/lib/ -llapack
appel.o: In function `appel_':
appel.f90:(.text+0x12b): undefined reference to `sgetrf_'
appel.f90:(.text+0x17c): undefined reference to `sgetrs_'
/usr/lib/gcc/i486-linux-gnu/4.3.3/libgfortranbegin.a(fmain.o): In function `main':
(.text+0x35): undefined reference to `MAIN__'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [essai] Erreur 1


On voit apparaître les procédures de la librairie nommé sgetrf et sgetrs. Il a donc l'air de les voir la première fois...

Je crois que j'ai besoin d'aide... :crash:

PS: Si j'essaie comme tu me l'avais conseillé LIBS= -llapack, ça me met la même erreur que la deuxième ci-dessus.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Juil 2009, 13:09

re,

en parcourant un peu le net, j'ai lu que il pouvait y avoir des problemes si on melangeait C et gfortran (notamment avec des underscore qui apparaissent). voir ici

un autre truc con, c'est est-ce que tu as bien un main definit dans le code source, mais bon, je pense que c'est le cas :we:

liblapack.a, liblapack.so, liblapackgf-3.so

Le so, est une lib precompilée, le .a est pour une lib statique (a compiler avec tes sources), sauf erreur.
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 13:46

fatal_error a écrit:re,

en parcourant un peu le net, j'ai lu que il pouvait y avoir des problemes si on melangeait C et gfortran (notamment avec des underscore qui apparaissent). voir ici


Je l'ai aussi vu. Mais j'ai que du fortran moi... je pense que tu es tombé dessus en copiant l'erreur que je rencontre et en cherchant avec google ?!?
fatal_error a écrit:un autre truc con, c'est est-ce que tu as bien un main definit dans le code source, mais bon, je pense que c'est le cas :we:


En fait, mon programme principal s'appelle main (il ne fait qu'appeler les fonctions (que je crée). Il ne devrait pas y avoir de problèmes. J'ai aussi essayé de l'appeler autrement (prog), et l'erreur reste la même...

fatal_error a écrit:Le so, est une lib precompilée, le .a est pour une lib statique (a compiler avec tes sources), sauf erreur.


Merci pour l'info, je ne savais pas. Cela signifie que je peux utiliser une libraire .so sans autre? Mais comment fait-on pour compiler une librairie?

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Juil 2009, 15:54

pour la lib statique :
$(EDL) $(OBJS) -LcheminDeMaLib -lmaLibStatique -o
maLibStatique sera compilée avec les sources (OBJS).
Je l'ai aussi vu. Mais j'ai que du fortran moi... je pense que tu es tombé dessus en copiant l'erreur que je rencontre et en cherchant avec google ?!?

oui, j'avoue :hum:

Pour le coup, je ne vois pas d'ou cela peut venir. Peutêtre que quelqu'un est plus au taquet sur le fortran...
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 19:20

Merci du temps que tu as pris pour mon problème... il n'est toujours pas résolu... . Peut-être faut-il que je change de compilateur (j'ai lu sur le net que gfortran n'était pas "aussi bon" que d'autre... j'ai pensé à g95, mais il n'est pas installé... je vais peut-être le faire, mais ça serait bizarre que ça marche: c'est pas un projet compliqué que je teste, et gfortran devrait pouvoir le faire. Mais c'est un peu ma dernière chance...

Encore merci!

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 10 Juil 2009, 19:55

re,

Eventuellement, je peux toujours essayer de regarder si ca te genes pas de partager tes sources (mais je garantie rien)
J'ai aussi lu que gfortran etait moins bien que g95, mais bon...j'ai des doutes que ca provienne de là. Certainement un problème de comp.
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 10 Juil 2009, 21:17

Je te passe volontiers mes sources... En fait, j'ai fait un petit "projet" (le mot est grand) qui contient:
- 1 fichier main qui appel 3 fonctions:
- une qui demande à l'utilisateur de remplir une matrice
- une qui demande à l'utilisateur de remplir un vecteur
- une qui appelle deux sous-routines de lapack
Le tout se trouve dans 4 fichiers (un pour chaque procédure). Et bien sûr le makefile... Bref, rien de bien confidentiel :hein: !

EDIT: Je remarque que si je change de compilateur, gcc au lieu de gfortran, j'obtiens un message d'erreur qui me semble similaire:

Code: Tout sélectionner
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [essai] Erreur 1


Cela me fait penser que mettre g95 ne résolvera pas le problème!

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 12 Juil 2009, 08:34

re,

j'imagine que tu es parti en WE. Jessairai de jeter un coup d'oeil quand tu auras posté un lien pour tes docs :we:
la vie est une fête :)

melreg
Membre Relatif
Messages: 325
Enregistré le: 10 Déc 2007, 20:09

par melreg » 12 Juil 2009, 20:00

En effet, je ne pouvais pas répondre avant... désolé. Et je ne sais pas comment te faire parvenir mes docs...

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite