[Visual Studio] Compilation de librairie statique

Mod Message lu Posté le 04 Oct 2008 à 10:53 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
J'aurais besoin d'un petit coup de main, et sachant que plusieurs développeurs pros passent dans le coin, peut-être certains connaissent-ils la solution...

Je cherche à compiler des librairies statiques qui soient autonomes, c'est à dire qu'une fois compilées, celles-ci n'aient plus besoin d'autres dépendances. Par exemple une librairie utilisant DirectX n'aurait plus besoin des librairies du SDK de ce dernier afin de fonctionner. Quelle serait l'option permettant cela ?

Dans le cas où cela serait impossible à faire automatiquement - j'ai cru l'entendre dire, mais ça m'étonne un petit peu - je souhaiterais au minimum avoir la possibilité d'utiliser mon .lib en dehors de mon projet Visual Studio. Si je créé un projet de librairie statique, puis que je le compile, et que je tente de le linker avec ses librairies dépendantes pour le rendre une bonne fois pour toute autonome, mon linker m'indique que le .lib que j'ai créé requiert un fichier du projet Visual Studio (un .obj, en l'occurence), celui-ci étant référencé par le chemin du type :
./release/library.obj, que mon linker ne peut interpréter car réservé au projet Visual Studio. Dans ce cas-ci, comment faire pour supprimer cette dispersion en une multitude de fichiers (sachant que les .lib générés automatiquement avec un projet par exemple de type DLL n'a pas ce problème) ?
bebou007 Message lu Posté le 04 Oct 2008 à 12:11 Bulle
Avatar de bebou007
Explorateur

Messages : 238
GCPoints : 43228
salut ben deja pour des librairie statique il suffit de les compiller en dll c'est les seul librairies qui n'ont plus besoins d'autre chose pour fonctionner et utilisable sous tous les language.


ensuite pour tes librairie statique normalement tu n'a besoin que du fichier .lib et du header contenant les prototype de tes fonction peut etre que tu te sert des nouveau projet de visual studio?

Mod Message lu Posté le 04 Oct 2008 à 12:33 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Ok, ça confirme donc en partie ce que j'avais déjà lu :/.
J'utilise actuellement des librairies dynamiques, et je souhaite justement passer à l'utilisation de librairies statiques, ne serait-ce que pour le petit gain de vitesse que cela procure... Donc je vais devoir inclure des tonnes de librairies, j'ai l'impression ^^'.

Pour la question, oui, j'utilise effectivement le wizard nouveau projet de Visual Studio pour créer une libriarie statique, mais je créé le nouveau projet sans fichier ni utilisation des headers précompilés... Je me demande donc d'où vient cette dépendance ou fichier .obj.

Merci pour la réponse ^^.
Dernière édition le 04 Oct 2008 à 12:33
bebou007 Message lu Posté le 04 Oct 2008 à 13:25 Bulle
Avatar de bebou007
Explorateur

Messages : 238
GCPoints : 43228
je vais réinstaller visual studio pour te faire un petit exemple d'utilisation moi je ne me sert pas du wizard de visual studio et je n'ai pas se probleme
Darktib Message lu Posté le 04 Oct 2008 à 15:43 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
En fait si tu as une .lib a mon avis c'est pas ce fichier le probleme mais le header : dedans tu doit inclure d'autres headers, et ainsi de suite...

Tu peux faire comme irrlicht : un dossier 'source', un dossier 'include', tu met les includes de la lib dans le dossier du meme nom et la source dans le dossier... 'source', bien entendu^^

Ensuite tu compile les sources (qui doivent elles aussi inclure les headers du dossier 'include') et tu te retrouve avec un .lib .

Tu link avec le lib, tu ajoute le dosier include dans le path de recherche du compilo, et c'est bon^^

si par contre tu ne veux pas de header, ptet que tu peux essayer avec les headers précompilés...
dstar Message lu Posté le 04 Oct 2008 à 18:07 Bulle
Avatar de dstar
Explorateur

Messages : 56
GCPoints : 25718
Je ne suis pas sûr de bien comprendre la question.

Lorsque l'on souhaite créer une bibliothèque statique avec Ms Visual Studio, on utilise la commande lib.exe de l'outil, et en sortie, on obtient une bibliothèque statique autonome (c.a.d que le code de l'ensemble des fichiers objet spécifiés à la commande se trouve dans la bibliothèque statique).
Pour être utilisée, cette bibliothèque doit ensuite être liée (via une édition de lien) à d'autres bibliothèques et fichiers objets pour créer un fichier exécutable. Lors de cette édition de lien, l'ensemble du code de la bibliothèque statique, qui est réellement susceptible d'être appelé, est intégré dans le fichier exécutable. Celui-ci n'aura donc pas besoin de charger de bibliothèque dynamique pour avoir accès au code contenu dans la bibliothèque statique. Il aura peut-être besoin de charger d'autres bibliothèques dynamiques pour accéder à un autre code, c'est dépendant de la façon dont on a fait l'édition de lien et dont on a intégré le reste du code qui n'est pas contenu dans la bibliothèque statique.
Il est également possible que la bibliothèque statique appelle du code contenu dans une bibliothèque dynamique. Dans ce cas, cette bibliothèque dynamique devra être chargée par le fichier exécutable.

D'une manière générale, il faut faire attention avec le format des bibliothèques statiques sous Ms Windows (fichiers avec une extension .lib) car ce format n'est pas standard. Il y a quelques années (je ne sais pas si c'est toujours le cas), les bibliothèques statiques générés avec l'outil Borland C++ Builder ne pouvait pas être liées dans un exécutable créé avec Ms Visual C++. Ce n'est heureusement pas le cas avec les bibliothèques dynamiques (fichiers avec extension .dll), celles-ci peuvent être chargées par n'importe quel fichier exécutable quel que soit l'outil avec lequel elles ont été créées.

Pour information, il existe des outils permettant de générer une bibliothèque statique à partir d'une bibliothèque dynamique, cette bibliothèque statique contenant l'ensemble du code de la bibliothèque dynamique.

dstar
dstar
Mod Message lu Posté le 04 Oct 2008 à 20:17 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
@ bebou : ce serait sympa, merci :).


@ Darktib : non, le problème ne vient vraisemblablement pas de là, vu qu'avec des librairies codées main en ASM, je n'ai pas ce soucis de link.


@ dstar : ma première question portait tout simplement sur la possibilité de rendre totalement autonome un fichier .lib par rapport à ses dépendances depuis Visual Studio.

Et ma seconde question sur comment compiler/linker les fichiers générés par Visual Studio :
lib de manière à les rendre totalement autonomes par rapport à Visual Studio même et les divers fichier du projet (.obj, etc.), j'obtiens actuellement ce genre de message :

Code :
POLINK: fatal error: Corrupt library: '.\\Jade_Window.lib'; unable to find symbol  
'_CreateMainWindow' in member '.\\release\\Jade_Window.obj'.


J'utilise là le linker de Pelles C.



Citation :

Lorsque l'on souhaite créer une bibliothèque statique avec Ms Visual Studio, on utilise la commande lib.exe de l'outi



Actuellement, je ne sors pas de l'interface de Visual Studio, je me contente donc du projet "de base" de librairie statique... Cela n'utilise-t-il pas automatiquement cet outil ?



Citation :

Pour information, il existe des outils permettant de générer une bibliothèque statique à partir d'une bibliothèque dynamique, cette bibliothèque statique contenant l'ensemble du code de la bibliothèque dynamique.



J'en ai eu vent, mais je n'en connais aucun, mais je suis tout à fait preneur si niveau fiabilité, ça vaut du .lib généré "normalement" et que tu as un logiciel à conseiller.


Merci pour les réponses :).
SEB Message lu Posté le 04 Oct 2008 à 21:38 Bulle
Avatar de SEB
Membre Evolué

Messages : 554
GCPoints : 103313
Code :
POLINK: fatal error: Corrupt library: '.\\Jade_Window.lib'; unable to find symbol  
'_CreateMainWindow' in member '.\\release\\Jade_Window.obj'.


ben oui il faut tout simplement que tu relink les bibliotheque en fait le linkage des librairie externes ne se fait qu'au moment de la génération de l'exe ... en gros si tu crée une lib que tu link avec une autre en te disant que tu n'auras plus besoin de le faire ... c'est faut.. ou alors c'est exactement ca qu'il faudrait qu'on m'explique et qui résoudra ton probleme. Mais personnellement je n'ai jamais réussi à faire autrement que de ne linker que à la génération de l'executable.

Apres... il y a peut etre moyen de créer une seule lib à partir de deux.... à voir....

NextGine : 3D games engine
Nombre de lignes actuel : 77683
dstar Message lu Posté le 05 Oct 2008 à 00:16 Bulle
Avatar de dstar
Explorateur

Messages : 56
GCPoints : 25718

Citation :

@ dstar : ma première question portait tout simplement sur la possibilité de rendre totalement autonome un fichier .lib par rapport à ses dépendances depuis Visual Studio.



Ce n'est pas vraiment un problème d'outil, mais de code. Si dans le code de ta bibliothèque, tu appelles des opérations de la bibliothèque de Visual Studio, tu crées de facto une dépendance entre ta bibliothèque et celle de VS.


Citation :

Actuellement, je ne sors pas de l'interface de Visual Studio, je me contente donc du projet "de base" de librairie statique... Cela n'utilise-t-il pas automatiquement cet outil ?



Pour créer une bibliothèque statique à partir de l'IDE de VS, il faut créer un projet de type Bibliothèque de classes, puis sélectionner le projet dans l'explorateur de projet situé sur la gauche de l'IDE. Dans le menu Projets, cliquer sur Propriétés. Une boîte de dialogue s'affiche avec un arbre d'options. Sélectionner Propriétés de configuration. Dans la partie de droite de la boîte de dialogue, modifier la valeur du champ Type de configuration pour la mettre à Bibliothèque statique (.lib). Lorsque tu regénères le projet, ça te créera une bibliothèque statique en utilisant intrinsèquement la commande lib.exe de VS.


Citation :

Et ma seconde question sur comment compiler/linker les fichiers générés par Visual Studio :
lib de manière à les rendre totalement autonomes par rapport à Visual Studio même et les divers fichier du projet (.obj, etc.), j'obtiens actuellement ce genre de message :

Code :

POLINK: fatal error: Corrupt library: '.Jade_Window.lib'; unable to find symbol
'_CreateMainWindow' in member '.releaseJade_Window.obj'.



J'utilise là le linker de Pelles C.



Normalement, l'éditeur de lien de VS est la commande link.exe. Je ne connais pas celui de Pelles C, mais il ne doit pas être bien différent des autres. Je ne sais pas d'où vient cette opération, mais je ne l'ai pas vue dans les différentes bibliothèque fournies avec VS.


Citation :

J'en ai eu vent, mais je n'en connais aucun, mais je suis tout à fait preneur si niveau fiabilité, ça vaut du .lib généré "normalement" et que tu as un logiciel à conseiller.



Je n'ai jamais eu à faire ce type d'opération, donc je n'ai jamais testé ce genre d'outil. Il y en a un qui peut être utilisé gratuitement ici:
http://www.sharewareconnection.com/dll-to-lib.htm

Je ne sais pas ce qu'il vaut.

dstar
Dernière édition le 05 Oct 2008 à 00:29
dstar
bebou007 Message lu Posté le 05 Oct 2008 à 00:37 Bulle
Avatar de bebou007
Explorateur

Messages : 238
GCPoints : 43228
salut alors apres relecture j'ai peut etre mal compris le fichier .lib tu essaye de le linker avec autre chose que visual studio?

pour se qui et de visual studio le fichier .lib et le header suffisse donc normalement il ne devrais pas y avoir de probleme.

voila comment je fait pour faire une lib et comment je l'include dans un autre projet sous visual studio.

deja je commence sur un projet vide ou alors sur un projet drkgdk mais je ne prend pas de wizard de visual studio.

Image


ensuite je crée met fichier header et cpp avec les prototype des fonction ou class dans le header puis je vais dans les proprieter du projet et je change les option pour avoir un fichier .lib au lieux d'un .exe

Image



Image


ensuite apres compilation du projet je recupere les deux fichier header et lib

Image



Image



la je configure un dossier pluging (par example) qui sera toujour referencer par visual studio et j'aurais plus qua metre les fichier dedans pour qu'il soit toujour trouver.


Image



apres il suffit de crée un autre projet et d'aller dans les option du projet et de linker le .lib en mettant le nom du .lib dans la case depandance suplementaire et en debut du fichier cpp il faut metre #include "lib.h"


Image



je sais pas si j'ai etais asser clair mais je sais juste que j'ai besoin de rien d'autre que le fichier .lib et du header.

par contre j'ai tenter de linker une lib qui elle meme utiliser une lib que j'ai crée et dans mon projet finale j'ai du aussi metre le nom du fichier .lib dans depandance suplementaire.

Mod Message lu Posté le 05 Oct 2008 à 18:33 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Merci pour votre aide... Problème résolu :D.

J'ai fouiné encore et encore dans les options de Visual Studio pour trouver le petit cadeau surprise : ce sont les optimisations des fichiers compilés qui viennent poser problème. Une fois retirées, tout fonctionne correctement. Joie.

J'ignore encore si d'autres linkers que celui du Visual Studio sont capables de prendre en compte ces optimisations, mais le fait que que le problème soit résolu pour le linker que j'utilise me convient parfaitement ^^.
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0413 secondes