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
bonjour,

Je debute en c++, et je ne sais pas du tout comment sa fonctionne.
J'ai voulu installer un librairie mais n'ayant pas le mot de passe root, je l'ai installé dans mon home.

Donc dans le .cpp, j'ai mis :
#include "home/LIBCOV/include/cov.h"

Jusque la pas de soucis.
Je compile avec :
g++ -ggdb -o test test.cpp -I/home/LIBCOV/include -L/home/LIBCOV/lib

Mais des que j'appel un fonction de cette fameuse librairie, c'est la pagaille :
...
test.cpp:19: undefined reference to `covAlignment::GetNumSites()'
...

J'ai le meme message pour toutes les fonctions appelées ...

Alors comment lui dire ou son ses librairie autrement que comme je l'ai fait, ou ai je oublié quelque chose ..

merci

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
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.
0
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 !!
0
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+
0
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
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
0

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
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
0
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
gcc -c source.c -I./include

l'edition de lien se fait correctement avec
gcc -o prog source.o -L./lib -lfiles
mais 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 type
et le prog n'est pas utilisable ???!
Merci encore
Ciao
0
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
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.
0
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
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: ...)):
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
0