Compilation c++

nico -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. crabs Messages postés 909 Statut Membre 507
     
    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
  2. SKZ
     
    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
  3. nico
     
    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
  4. Mohamed
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
    1. Mohamed
       
      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
  7. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  8. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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