Pb pour lier une librairie externe à un projet

Pb pour lier une librairie externe à un projet - C++ - Programmation

Marsh Posté le 07-04-2005 à 08:53:34    

Bonjour,  
 
Je n'arrive pas à lier la librairie jpeg ou tif ... J'utilise une classe CImage que j'ai trouvé sur internet ((http://micromeg.free.fr/programmeur.html) pour manipuler des fichiers images de toutes sortes et en particulier les tif et jpg.  
Pour compiler le projet CImageDemo (à l'aide de Visual C++ v6.0), j'ai besoin d'inclure au projet les librairies esternes jpg et tif (ImageLib). Lors de la compilation, le compilateur ne trouve pas et a un pb avec le header file nommé jpeglib.h ou encore tiffiop.h alors que je les ai inclu ds le projet (present dans la liste des header du projet) et j'ai meme placé les fichiers de la librairie ds le meme dossier que les sources.
 
Je ne comprend pas poukoi il y a un ImageLib.dsw dans le pack de librairie pour jpeg, tiff ou png. Mais je n'arrive pas plus à le compiler, j'ai cette fois le meme problème avec zlib.h.
 
L'erreur affichée par le debuggeur est :
(...) fatal error C1038: Cannot open include file: 'tiffiop.h' (...), cette erreur survient à la ligne suivante :
#include <tiffiop.h>
 
Ce header file est pourtant bien lié à mon projet.
 
Il y a surement qqch de particulier à faire pour lier une librairie externe. Pouvez-vous m'aider ? il n'y a pas une histoire de .lib à compiler ...
 
Merci,  
BAJAX

Reply

Marsh Posté le 07-04-2005 à 08:53:34   

Reply

Marsh Posté le 07-04-2005 à 09:08:19    

Tu as l'air de confondre fichier d'en-tête (.h) et bibliothèque (.lib). Généralement, un fichier d'en-tête (un header file) sert à déclarer des fonctions qui sont définies plus tard dans un .lib. Il te faut donc ajouter les .h et le .lib là où ça va bien dans Visual Studio (respectivement dans la liste des fichiers du projet, et dans la liste des librairies à inclure dans les propriétés "link" du projet).
 
Mais en plus, tu confonds l'inclusion d'un fichier dans un projet et sa visibilité depuis les autres fichiers (grâce aux règles d'Include Paths).  
 
Il faut donc que tu rajoutes le répertoire où se trouve tiffiop.h dans la liste des répertoire d'inclusion. Ca se met aussi dans les propriétés du projet, dans la catégorie C++/Preprocessor  je crois.


Message édité par Lam's le 07-04-2005 à 09:09:26
Reply

Marsh Posté le 07-04-2005 à 10:41:46    

Salut,  
 
Déjà merci pour tes conseils,c tres sympa.
 
Ce qui me parrait etrange c'est que je n'ai aucun .lib dans le repertoire ImageLib que j'ai telechargé à l'adresse suivante :
http://micromeg.free.fr/programmeur.html
 
Il est donc logique que ca me plante à #include <jpeglib.h> si celui si n'est pas declaré dans un .lib aproprié ...
 
Ou puis-je trouver ces .lib appropriés ? Est-ce le fruit d'une compilation (ds mon cas de ImageLib.dsw). Le nouveau pb est que ce projet ne compile pas à cause de la meme chose mais cette fois, ca plante à l'inclusion de zlib.h !!!!!  
 
Peux-tu m'aider, stp ?
 
Merci
BAJAX

Reply

Marsh Posté le 07-04-2005 à 11:05:17    

bajax a écrit :

Salut,  
Ce qui me parrait etrange c'est que je n'ai aucun .lib dans le repertoire ImageLib que j'ai telechargé à l'adresse suivante :
http://micromeg.free.fr/programmeur.html


Tu en auras un lors de la compilation de ImageLib.
 
 

Citation :

Il est donc logique que ca me plante à #include <jpeglib.h> si celui si n'est pas declaré dans un .lib aproprié ...


Non, un .h n'est pas contenu dans un .lib. Un .h se contente de déclarer des fonctions (openJpeg() par exemple). Ces fonctions, le linker trouvera le code dans le .lib. Mais il ne se sert pas du tout du .lib à la compilation: il s'en sert juste à l'édition de liens.
 

Citation :

Ou puis-je trouver ces .lib appropriés ? Est-ce le fruit d'une compilation (ds mon cas de ImageLib.dsw).  


Farpaitement.
 

Citation :

Le nouveau pb est que ce projet ne compile pas à cause de la meme chose mais cette fois, ca plante à l'inclusion de zlib.h !!!!!


Ca plante comment ? Parce que c'est ça la première étape.
 
Tes 2 problèmes avec jpeglib.h et zlib.h m'ont l'air de venir du fait que le répertoire "Headers" ne fais pas partie de tes répertoires d'inclusion dans ton projet Visual Studio.

Reply

Marsh Posté le 07-04-2005 à 12:03:06    

^Merci pour toutes ces indications !
 
Si j'ai bien compris mon fameux ImageLib.dsw doit etre compiler pour creer mon .lib et enfin pouvoir l'utiliser pour compiler CImageDemo.dsw. En fait, j'ai maintenant compris que j'avais choppé les fichiers sources necessaire pour creer mon .lib approprié.
 
Donc voilà mon pb, maintenant :
 
Je ne parviens pas à compiler le ImageLib.dsw à cause de zlib.h ! Le compilateur m'indique : (...)fatal error C1083: Cannot open include file: 'zlib.h' (...)
 
Donc, j'ai suivi tes conseils. Dèjà ce header est bien dans l'arborescence du workspace, ensuite je n'ai pas reussi à trouver 'link' comme tu m'as indiqué (j'utilise Microsoft Visual C++ 6.0) mais j'ai trouvé dans Tools/Options... puis dans l'onglet Directories ... un endroit pour indiquer au logiciel ou aller voir. J'ai donc rajouté ce chemin pour les include files, source files et library ... Comme ca j'etais sur de mon coup !
 
Malheureusement, j'ai exactement les meme erreurs à la compilation: ce pb avec zlib.h.
Ai-je fais la bonne manip pour inclure le repertoires des "headers" ?
 
 
Merci encore
C++      :ange:  
 
 

Reply

Marsh Posté le 07-04-2005 à 12:13:05    

bajax a écrit :

Ai-je fais la bonne manip pour inclure le repertoires des "headers" ?


Donc tu as ajouté le répertoire là :
http://www.smartarrays.com/new/downloads/manual/includefiles.jpg
 
C'est bien ce qu'il faut faire. Mais qu'as-tu mis exactement ?

Reply

Marsh Posté le 07-04-2005 à 14:01:10    

Ouai c'est bien ca !!!!  
Ds cette boite de dialogue, j'ai cliqué sur le bouton pour ajouter un path (bouton à gauche des autres) puis j'ai cliqué sur le bouton contenant trois petits points (l'equivalent de parcourir) et j'ai ajouté le dossier dans lequel se trouve tous mes fichiers associer au projet.
Puis j'ai cliqué sur OK !
 
Ca n'a rien changé pour la compilation !
 
J'ai bien fais les choses je pense, non ?
 
 
 
Bajax

Reply

Marsh Posté le 07-04-2005 à 14:05:05    

bajax a écrit :

Ouai c'est bien ca !!!!  
Ds cette boite de dialogue, j'ai cliqué sur le bouton pour ajouter un path (bouton à gauche des autres) puis j'ai cliqué sur le bouton contenant trois petits points (l'equivalent de parcourir) et j'ai ajouté le dossier dans lequel se trouve tous mes fichiers associer au projet.
Puis j'ai cliqué sur OK !
 
Ca n'a rien changé pour la compilation !
 
J'ai bien fais les choses je pense, non ?
 
 
 
Bajax


Et donc... Qu'as tu mis comme nom de dossier dedans ?
 

Reply

Marsh Posté le 07-04-2005 à 15:06:58    

Merci, ca avnace petit à petit ...
 
J'ai bien fais gaffe à ce que j'avais mis comme chemin, et en fait j'avais mis comme chemin le chemin d'un repertoir dans lequel se trouvait un repertoire avec mes headers ...
A priori, il faut mettre le dernier repertoire fils pour que ca fonctionne !!
Autre chose, à la fin de la compilation, il y a controle activeX qui s'execute. Est-ce normal et à quoi ca sert ?  
Ce problème resolu, il en amene un autre !!!!!
 
Enfin, j'ai un ImageLibD.lib qui s'est créé ! Maintenant, lorsque je veux compiler la demo de la classe (CImageDemo.dsw) Le compilateur ne bloque plus comme auparavant sur jpeglib.h ou tiffiop.h mais m'nidique l'erreur suivante :
 
LINK: fatal error LNK1104: Cannot open file "ImageLibDMTD.lib" !!!!
 
Je ne sais d'ou sort cette librairie !!! Que faire de mon .lib que j'ai créé .
 
Merci

Reply

Marsh Posté le 07-04-2005 à 15:17:40    

bajax a écrit :

Je ne sais d'ou sort cette librairie !!! Que faire de mon .lib que j'ai créé .


C'est le "produit" de ton projet ImageLib. Il se trouve par défaut dans un sous répertoire "Debug" ou "Release" du répertoire où tu as dézippé ImageLib.  
 
Tu n'as qu'à rajouter le dit répertoire (Debug ou Release) dans le chemin de recherche des librairies. A peu près au même endroit où tu as rajouté le chemin des headers.
 
Ou bien (une autre solution), tu ajoutes le projet ImageLib.dsp à ton workspace, et dans les "Workspace Dependencies", tu indiques que ton projet dépend du projet ImageLib.
 

Reply

Marsh Posté le 07-04-2005 à 15:17:40   

Reply

Marsh Posté le 08-04-2005 à 10:11:45    

Merci pour ces renseignements ...
Qd j'ai compilé ImageLib, le "produit" etait "ImageLibD.lib" et seuleument celui ci. J'ai donc fais des recherches ds les sources pour savoir où est-ce que ca parlait de l'autre "ImageLibDMTD.lib" et je me suis appercu qu'il fallait que je le compile avec Win32 Debug Multithreaded DLL ...
 
Il me manquait ensuite un autre .lib et en fait je davais compiler ma librarie avec toutes les sortes de Win 32 debug, release, multhreaded avec dll et sans ...
 
J'ai ainsi obtenu au final 6 .lib !
 
J'ai suivit ton conseil, j'ai inclu mon projet dans mon workspace et ca a compilé ...
 
Un gd merci à toi Lam's !!!! C'est tres sympa.
 
Par contre, est-ce que tu peux m'expliquer brievement ce que c'est que tous ces Win32 ... J'ai fais ce qu'il fallait mais je ne sais pas ce que j'ai fais et je n'ai aucunes idées de ce à quoi servent tous ces win32 debug, release ... ni meme ce qu'est win32. J'aimerai bien comprendre.

Reply

Marsh Posté le 08-04-2005 à 12:39:59    

bajax a écrit :

Par contre, est-ce que tu peux m'expliquer brievement ce que c'est que tous ces Win32 ... J'ai fais ce qu'il fallait mais je ne sais pas ce que j'ai fais et je n'ai aucunes idées de ce à quoi servent tous ces win32 debug, release ... ni meme ce qu'est win32. J'aimerai bien comprendre.


Win32, c'est le système pour lequel tu compiles : Windows en 32 bits. D'autres systèmes existent: .NET, MS-DOS (Visual C++ le faisait dans sa version 2.0), etc.
 
Ensuite, il y a 2 modes de compilation par défaut (mais tu peux les changer, en enlever ou en rajouter): Debug ou bien Release. Debug, ça veut dire que les infos de Debugage sont rajoutées, et que le code n'est pas optimisé. Release, c'est l'inverse.
 
Ensuite, ton code utilise les librairies standard du C et du C++ (printf, malloc, new, les iostreams, etc.). Tu as le choix entre utiliser la version Single-thread ou Multi-thread de ces librairies. En pratique, on utilise quasiment toujours les Multithreads.  
 
Et tu as le choix de lier contre les DLLs de la lib standard, ou d'inclure le code directement dans ton exécutable. En pratique, en 1995, on faisait pas mal de link "statique" (c'est à dire include la Lib standard dans son exe) car ca prenait moins de place que d'inclure toute la DLL lors de l'installation. De nos jours, on utilise quasiment toujours la DLL.
 
Et en plus, c'est la même chose pour les librairies que tu produit toi-même: tu peux décider de fournir des libs statiques (juste un .lib, qui contient tout le code), ou bien des libs dynamiques (un .lib et un .dll, le code se trouvant dans le DLL).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed