Compilation c++
Fermé
nico
-
17 mai 2005 à 19:44
mamiemando Messages postés 33558 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 mars 2025 - 13 juin 2005 à 20:19
mamiemando Messages postés 33558 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 10 mars 2025 - 13 juin 2005 à 20:19
A voir également:
- Compilation c++
- Breach compilation c'est quoi - Guide
- Compilation error: expected unqualified-id before '{' token ✓ - Forum C++
- Compilation error: expected ')' before ';' token ✓ - Forum C
- Erreur de compilation projet ou bibliothèque introuvable ✓ - Forum Excel
- Message d'erreur Excel projet ou bibliotheque introuvable ! - Forum Excel
7 réponses
crabs
Messages postés
908
Date d'inscription
lundi 18 avril 2005
Statut
Membre
Dernière intervention
3 août 2008
507
17 mai 2005 à 21:08
17 mai 2005 à 21:08
Salut,
[il semblerai que tu soit sous UNIX et peut-être LINUX]
Je connais pas la lib 'COV', mais le principe est le suivant :
dans un dossier include : les fichiers qui décrivent les classes
dans un dossier lib : les fichiers qui contiennent les classes compilées
Ces fichiers sont reconnaissables par des extension .a (bibliothèque statique)
ou .so (bibliothèque dynamique). Un de ces fichiers doit être fourni lors
de l'édition des liens (création de l'exécutable).
Tu trouve un fichier qui à soit le nom libxxxx.a ou libxxxx.so.
Il peut y en avoir plusieurs. Habituellement le xxxx.h correspond
au nom du fichier 'include'.
Tu rajouter -lxxxx à la ligne de compilation et plus précisément
d'édition de lien.
Exemple pour la lib qt.
dans le source c++ : #include <qt.h>
à l'édition de liens : g++ -o ... ... ... ... -lqt
Espérant que ça puisse t'aider.
[il semblerai que tu soit sous UNIX et peut-être LINUX]
Je connais pas la lib 'COV', mais le principe est le suivant :
dans un dossier include : les fichiers qui décrivent les classes
dans un dossier lib : les fichiers qui contiennent les classes compilées
Ces fichiers sont reconnaissables par des extension .a (bibliothèque statique)
ou .so (bibliothèque dynamique). Un de ces fichiers doit être fourni lors
de l'édition des liens (création de l'exécutable).
Tu trouve un fichier qui à soit le nom libxxxx.a ou libxxxx.so.
Il peut y en avoir plusieurs. Habituellement le xxxx.h correspond
au nom du fichier 'include'.
Tu rajouter -lxxxx à la ligne de compilation et plus précisément
d'édition de lien.
Exemple pour la lib qt.
dans le source c++ : #include <qt.h>
à l'édition de liens : g++ -o ... ... ... ... -lqt
Espérant que ça puisse t'aider.
Alors comment lui dire ou son ses librairie autrement que comme je l'ai fait, ou ai je oublié quelque chose ..
A noter : il y a redondance entre :
#include "/home/LIBCOV/include/cov.h"
(par contre tu a oublié le / du début...) et l'option
-I//home/LIBCOV/include/
Soit tu utilise le #include de ton code (avec le '/' au début), soit tu met :
#include "cov.h"
(Ce qui est pratique quand le répertoire d'install de la libcov est amené à changer, il suffit de paramétrer le makefile pour l'option -I, bref...)
Ensuite, l'option -L sert à spécifier où sont les biblis qui ne sont pas dans les répertoires standards (comme /usr/lib, etc... y'a forcément l'équivalent sous Win [NDMM : je viens de me rendre compte qu'on s'en fout, nous deux...]).
Mais il te manque -lcov, qui indique de lier l'éxécutable avec libcov (.so ou .a).
Si c'est libcov.so, soit tu met -static pour forcer une édition de lien statique (!! à l'augmentation de la taille de l'éxé), grâce à l'option -static,
soit tu paramètre LD_LIBRARY_PATH, l'option du chemin standard pour les biblios. Cela sert à indiquer des chemin supplémentaire pour les bibliothèques partagées (les fameuses DLL, terme plus "windowsien", Shared Library ou Shared Object (so) sous UNIX).
sous bash :
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/LIBCOV/lib/
(ou autre répertoire incluant libcov.so), pour paramètrer ce chemin.
Voilà, avec ça ton éxé devrait rouler !!!
(NB : quand tu as le mdp root, tu peux rajouter un chemin VRAIMENT par défaut en éditant /etc/ld.so.conf. En l'occurence le mien contient :
/usr/X11R6/lib
/usr/lib/qt3/lib
/usr/local/lib
Ensuite il est necessaire de faire un
# ldconfig
pour que ld (LoaDer, qui charge aussi les .so) prenne la modif en compte)
Voili violon !!
A noter : il y a redondance entre :
#include "/home/LIBCOV/include/cov.h"
(par contre tu a oublié le / du début...) et l'option
-I//home/LIBCOV/include/
Soit tu utilise le #include de ton code (avec le '/' au début), soit tu met :
#include "cov.h"
(Ce qui est pratique quand le répertoire d'install de la libcov est amené à changer, il suffit de paramétrer le makefile pour l'option -I, bref...)
Ensuite, l'option -L sert à spécifier où sont les biblis qui ne sont pas dans les répertoires standards (comme /usr/lib, etc... y'a forcément l'équivalent sous Win [NDMM : je viens de me rendre compte qu'on s'en fout, nous deux...]).
Mais il te manque -lcov, qui indique de lier l'éxécutable avec libcov (.so ou .a).
Si c'est libcov.so, soit tu met -static pour forcer une édition de lien statique (!! à l'augmentation de la taille de l'éxé), grâce à l'option -static,
soit tu paramètre LD_LIBRARY_PATH, l'option du chemin standard pour les biblios. Cela sert à indiquer des chemin supplémentaire pour les bibliothèques partagées (les fameuses DLL, terme plus "windowsien", Shared Library ou Shared Object (so) sous UNIX).
sous bash :
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/LIBCOV/lib/
(ou autre répertoire incluant libcov.so), pour paramètrer ce chemin.
Voilà, avec ça ton éxé devrait rouler !!!
(NB : quand tu as le mdp root, tu peux rajouter un chemin VRAIMENT par défaut en éditant /etc/ld.so.conf. En l'occurence le mien contient :
/usr/X11R6/lib
/usr/lib/qt3/lib
/usr/local/lib
Ensuite il est necessaire de faire un
# ldconfig
pour que ld (LoaDer, qui charge aussi les .so) prenne la modif en compte)
Voili violon !!
Merci a tout les deux ...
En effet, j'avais oublié le -lcov a la fin de ma ligne de compilation.
Et pour l'execution, je n'avais pas de variable $LD_LIBRARY_PATH
Merci, il me reste plus qu'a apprendre a utiliser cette librairie :-)
a+
En effet, j'avais oublié le -lcov a la fin de ma ligne de compilation.
Et pour l'execution, je n'avais pas de variable $LD_LIBRARY_PATH
Merci, il me reste plus qu'a apprendre a utiliser cette librairie :-)
a+
Bonjour,
Je vous remrcie, je n'ai pas mal appris de vos contribution,
Toute fois, je n'ai pas tout compris il parait, car je n'arrive pas à faire l'édition de lien d'un programme,
Q1) la spécification des chemins des librairies avec -L se fait au moment de la compilation ou bien de l'edition de lien,
par exemple si je compile mon programme comme suis
la compilation se fait normalement
maintenant pour l'edition de lien, j'ai une librairie libmediastreamer.a qui se trouve dans $HOME/Appli/lib je dois faire comment pour cette edition de lien ?
Q2) C'est quoi la différence entre les fichier file.a, file.la, file.lo, file.so ? ont il un rapport avec file.o ?
Merci de votre aide,
S'il y'a un site qui explique bien ceci, merci de me l'indiquer,
Ciao
Je vous remrcie, je n'ai pas mal appris de vos contribution,
Toute fois, je n'ai pas tout compris il parait, car je n'arrive pas à faire l'édition de lien d'un programme,
Q1) la spécification des chemins des librairies avec -L se fait au moment de la compilation ou bien de l'edition de lien,
par exemple si je compile mon programme comme suis
gcc -c source.c -I$HOME/Appli/Include
la compilation se fait normalement
maintenant pour l'edition de lien, j'ai une librairie libmediastreamer.a qui se trouve dans $HOME/Appli/lib je dois faire comment pour cette edition de lien ?
Q2) C'est quoi la différence entre les fichier file.a, file.la, file.lo, file.so ? ont il un rapport avec file.o ?
Merci de votre aide,
S'il y'a un site qui explique bien ceci, merci de me l'indiquer,
Ciao
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
10 juin 2005 à 11:09
10 juin 2005 à 11:09
http://www.developpez.com/ puis C/C++ tutoriel, gcc. j'ai pas trouver mieu pour l'instant malheuresement.
Q1 : ld source.o -lmediastreamer -L$HOME/aplli/lib
l'option -l indique quelle librairie utilisé. et -L le chemin. ld est le linker.
Q2 : file.a est une mauvaise librairie statique contenant file.o. En effet toute libraire doit commencer par lib, et finir par .a.
les autres, je ne sais pas trop, mais dans le lot, il y en a qui designent des librairies dynamique (non lié à la compil, mais à l'execution)
en fait, tu devrai avoir libfile.a pour la librairie faite à partir de file.o
l'interet d'une librairie (de ce que j'en ai compris) c'est de pouvoir mettre plusieurs .o dans un seul fichier que l'on peut lier par la suite. De plus on peut passer par dessus les fonctions contenue dans le .a
exemple, si tu fait ld source.o file.o -lfile
tu n'aura pas d'erreur, les fonction contenue dans file.o remplacerons celles contenue dans libfile.a
Q1 : ld source.o -lmediastreamer -L$HOME/aplli/lib
l'option -l indique quelle librairie utilisé. et -L le chemin. ld est le linker.
Q2 : file.a est une mauvaise librairie statique contenant file.o. En effet toute libraire doit commencer par lib, et finir par .a.
les autres, je ne sais pas trop, mais dans le lot, il y en a qui designent des librairies dynamique (non lié à la compil, mais à l'execution)
en fait, tu devrai avoir libfile.a pour la librairie faite à partir de file.o
l'interet d'une librairie (de ce que j'en ai compris) c'est de pouvoir mettre plusieurs .o dans un seul fichier que l'on peut lier par la suite. De plus on peut passer par dessus les fonctions contenue dans le .a
exemple, si tu fait ld source.o file.o -lfile
tu n'aura pas d'erreur, les fonction contenue dans file.o remplacerons celles contenue dans libfile.a
Salut,
Je te remercie pour la doc, elle est vraiment interessante je l'ai lu passionnement, elle confirme ce que t'as expliqué brevement,
D'ailleur j'ai reussi a compiler et linker mon prog,
Toute fois j'ai remarqué un truc bizzare je sais pas si qqn as deja eu la meme chose,
Apres compilation avec
l'edition de lien se fait correctement avec
Merci encore
Ciao
Je te remercie pour la doc, elle est vraiment interessante je l'ai lu passionnement, elle confirme ce que t'as expliqué brevement,
D'ailleur j'ai reussi a compiler et linker mon prog,
Toute fois j'ai remarqué un truc bizzare je sais pas si qqn as deja eu la meme chose,
Apres compilation avec
gcc -c source.c -I./include
l'edition de lien se fait correctement avec
gcc -o prog source.o -L./lib -lfilesmais qd j'ai essaie de la lier directement avec le linker
ld -o prog source.o -L./lib -lfilesça me donne le message suivant
mohamed@linux4:~/tampon/compil> ./linker ld: AVERTISSEMENT: ne peut trouver le symbole d'entrée _start; utilise par défaut 0000000008050ca0 mohamed@linux4:~/tampon/compil> ./prog bash: ./prog: Aucun fichier ou répertoire de ce typeet le prog n'est pas utilisable ???!
Merci encore
Ciao
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
13 juin 2005 à 18:00
13 juin 2005 à 18:00
essai de rajouter -L./ dans ta ligne de link.
En fait, j'ai eu des problèmes similaire. selon que l'on utilise gcc g++ ou ld pour lier, j'ai l'impression que ce ne sont pas les même répoertoire de recherche par défaut.
En fait, j'ai eu des problèmes similaire. selon que l'on utilise gcc g++ ou ld pour lier, j'ai l'impression que ce ne sont pas les même répoertoire de recherche par défaut.
mamiemando
Messages postés
33558
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
10 mars 2025
7 833
13 juin 2005 à 20:19
13 juin 2005 à 20:19
Tiens ca fait des années que je fais du c/c++ et j'ai jamais eu à utiliser ld sauf cas super spécifique. A ta place je ferais simplement un makefile. Crée un fichier Makefile contenant ceci (respecte bien les tabulations derriere les cibles !! (all: run: ...)):
Avec ici un fichier main_plop.cpp contenant la fonction main et plop1.cpp plop2.cpp plop3.cpp des modules.
La commande make permettra ensuite d'utiliser ce fameux fichier....
Pour l'utiliser la première fois :
Par la suite :
Et pour virer les .o et le .exe (ie les binaires) :
CXX=g++ CXXFLAGS=-W -Wall -O2 SRC=\ plop1.cpp\ plop2.cpp\ plop3.cpp OBJ=\ plop1.o\ plop2.o\ plop3.o all: $(OBJ) $(CXX) $(CXXFLAGS) $(OBJ) main_plop.cpp -o plop.exe depend: g++ -MM $(SRC) > .dependfile %.o:%.cpp;$(CXX) $(CXXFLAGS) -c $< -o $@ run: ./plop.exe clean: rm -rf *.o .dependfile *.exe touch .dependfile ifeq (.dependfile,$(wildcard .dependfile)) include .dependfile endif
Avec ici un fichier main_plop.cpp contenant la fonction main et plop1.cpp plop2.cpp plop3.cpp des modules.
La commande make permettra ensuite d'utiliser ce fameux fichier....
Pour l'utiliser la première fois :
make depend make
Par la suite :
make
Et pour virer les .o et le .exe (ie les binaires) :
make clean