IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Comment créer (et ensuite utiliser) une bibliothèque statique sous Visual C++ express


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 150
    Par défaut Comment créer (et ensuite utiliser) une bibliothèque statique sous Visual C++ express
    Débutant en Visual C++, je souhaite recréer les bibliothèques xxx.lib que j'avais créées sous Borland C++. Je ne trouve pas de modèle dans la documentation en ligne. On me propose un modèle de "bibliothèques de classes", mais, comme je suis débutant, je ne comprends pas encore grand chose aux classes et je veux juste, pour l'instant, créer des fonctions C une fois pour toutes pour éviter d'avoir à en recopier le code dans tous mes programmes.

    Ensuite, j'imagine qu'il suffira d'inclure une référence au fichier .h (#include "xxx.h") et à la librairie (USELIB("c;\...\xxx.lib")) pour avoir accès à ces fonctions dans n'importe quel programme. Ai-je raison ? Où est-ce plus compliqué ?

    Merci d'avance pour tout conseil !

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Tu peux par exemple faire un projet Win32, et dans l'onglet général, tu mettras la propriété "Type de configuration" sur "Librairie statique (.LIB)".

    Après, je n'utilise pas VS Express mais la version complète, qui possède un wizard de création de librairie statique :
    • Panneau de gauche : Projet Visual C++, choix "Win32".
    • Panneau de droite : Projet Win32.
    • Valider le nom et le répertoire, cliquer sur "OK", puis "Next".
    • Cocher "Librairie statique" au lieu de "Application Windows", cliquer sur "OK".
    A voir s'il y a le même pour VS Express, ce qui devrait être le cas.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 150
    Par défaut
    Merci de ta réponse !

    J'ai fait exactement ce que tu m'as dit. Le nom de mon projet est test13. Visual C++ a créé trois fichiers :
    stdafx.h, targetver.h, et stdafx.cpp

    Au pifomètre, j'ai choisi stdafx.cpp pour coder ma fonction "mafonction" (oui, c'est un test...). Puis, j'ai cliqué sur "générer->générer la solution" et ont été créés plusieurs fichiers dont un fichier test13.lib dans test13\debug. "test13.h" pour sa part n'a pas été créé, je suppose que c'est à moi de le faire, ce n'est pas un problème, bien sûr.

    A présent, si j'ai fait ce qu'il fallait faire, comment coder un programme appelant ? Je vais créer un programme qui dans son code va faire référence à mafonction(10) par exemple. Je devrais probablement inclure une ligne #include "c:\.....\test13.h" (que j'aurais créé préalablement), mais comment vais-je faire savoir au linker que la fonction manquante (mafonction) se trouve dans test13.lib ? Sous Borland C++, il fallait inclure une ligne USELIB("test13.lib") dans le code, et préciser au linker dans quel dossier se trouvaient les librairies auxquelles je faisait référence. Comment faire sous Visual C++ ? Apparemment, Visual C++ n'utilise pas ce mot "USELIB". La syntaxe est donc différente.

    Merci de me renseigner.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Bon, quelques points importants :
    • VS crée quelques fichiers "de base", mais ils ont un rôle très particulier qu'il te faut connaître.
    • Targetver.hpp est un fichier destiné à paramétrer la version minimale de Windows requise par ton programme. Cela aura une importance si tu veux que ton programme tourne aussi bien sur Windows 2000 que Windows 7.
      Pour l'instant, laisse-le tel quel.
    • StdAfx.h est l'entête primaire pour les entêtes précompilés. Cela sert à accélérer la REcompilation de ton projet, ou la compilation utilisant BEAUCOUP de librairies. Sur un projet "simple", c'est parfois plus problématique qu'autre chose d'utiliser les entêtes précompilés.
      Pour l'instant, je te conseille de ne pas t'en servir, du moins tant que tu n'as pas bien compris le concept de compilation séparée et de modules.
    • StdAfx.cpp est le fichier permettant, justement, de construire les entêtes précompilés. Par défaut, il est vide, et il doit le rester. Ce n'est PAS un fichier pour y mettre ton code !
    • Un fichier .H n'est jamais compilé, ce ne sont QUE les fichiers .C ou .CPP qui le sont. Donc, c'est normal que ton fichier "test13.h" ne soit pas compilé, il ne le sera qu'au travers des fichiers C/CPP qui l'utilisent.
    • Donc : essaie plutôt de partir d'un projet vide pour démarrer, cela t'évitera quelques nœuds au cerveau pour rien. Tu as le temps d'apprendre les subtilités propres à Visual Studio un peu plus tard, concentres-toi sur le langage lui-même pour l'instant.


    Pour utiliser une librairie (statique ou dynamique) sous Visual, tu as deux solutions :
    • Référencer explicitement la librairie dans ton exécutable. On peut faire ça de deux façons :
      • L'ajouter dans le champ "Librairies additionnelles" de la partie "Edition de liens" des propriétés de ton projet.
      • Utiliser un "#pragma comment(lib,"MaLibrairie")" dans le code, qui correspond au USELIB de BC++ (voire cette discussion et cette FAQ).
    • Utiliser les dépendances au sein de la solution : bouton droit sur ton exécutable, "Dépendances", et coche la librairie à utiliser.
    • Dans les deux cas, il te faudra ajouter les chemins vers les includes de ta librairie dans ton projet de toutes façons (voir cette FAQ).


    Pour rejoindre l'autre discussion : avec les DLL, c'est pareil, car c'est un problème de compilation dans un premier temps. Pour les dépendances de projet, VS gère très bien le fait que ce soit une DLL ou une LIB : en effet, pour les DLL, il génère une librairie d'importation qui t'évite d'avoir à linker manuellement les fonctions de la DLL.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2004
    Messages : 150
    Par défaut
    Achhhh ! Je ne comprends pas ! Désolé, j'ai la tête dure !
    Targetver.hpp est un fichier destiné ...Pour l'instant, laisse-le tel quel.
    Tu n'auras pas besoin de me dire ça deux fois ! Je n'y touche pas !
    StdAfx.h est l'entête primaire pour les entêtes précompilés...Pour l'instant, je te conseille de ne pas t'en servir
    Je n'y toucherai pas non pus !
    StdAfx.cpp est le fichier permettant, justement, de construire les entêtes précompilés. Par défaut, il est vide, et il doit le rester. Ce n'est PAS un fichier pour y mettre ton code !
    Bon, d'accord ! Mais, comme je te l'ai dit, c'est pourtant ce que j'ai fait ! J'ai cliqué sur "générer" et VS m'a effectivement créé un fichier test13.lib !!!!
    Qu'est-ce que peut bien contenir test13.lib à présent ???
    Un fichier .H n'est jamais compilé, ce ne sont QUE les fichiers .C ou .CPP qui le sont. Donc, c'est normal que ton fichier "test13.h" ne soit pas compilé, il ne le sera qu'au travers des fichiers C/CPP qui l'utilisent.
    Je n'ai pas dit que mon fichier test13.h n'était pas compilé ; j'ai dit qu'il n'existait pas. A fortiori ne peut-il pas être compilé ! Dans ma naïveté, j'ai pensé que VS allait me créer un fichier test13.cpp et me demander d'y loger mon code pour les fonctions que j'avais envie de mettre dans la LIB, et qu'il allait créer et remplir automatiquement un test13.h. J'ai justement remarqué qu'il n'avait rien fait de tel.
    Mon interprétation des fichiers .h est la suivante :
    Lorsqu'un code fait référence à une fonction qui n'existe pas dans ce code, le compilateur a besoin de connaître la syntaxe d'appel de la fonction pour indiquer à l'utilisateur si la fonction référencée est correctement appelée ou pas. Il laisse au linker le soin d'aller chercher où il pourra les fonctions précompilées dans des librairies (.lib) pour la création d'un exécutable complet, ou dans des librairies .dll lors de l'exécution. A mon avis, les fichiers .h ne sont pas compilés, car pas compilables ; elles ne contiennent que les prototypes des fonctions et pas leur code.
    Au demeurant, je trouve que cette expression "fichiers d'entête précompilés" est malheureuse. Le fichiers ne sont pas "précompilés" et ils ne seront pas davantage compilés ultérieurement. Ce sont les fonctions référencées dans ces fichiers qui ont été préalablement compilées, pas les fichiers, pas les entêtes ! Mais peut-être ai-je mal interprêté encore...
    Merci de me dire si j'ai au moins correctement compris ça !
    Donc : essaie plutôt de partir d'un projet vide pour démarrer
    Ça je ne comprends pas ! Je viens de demander à VS de créer une librairie qui s'appelle test13.lib ! Je m'attends par conséquent à trouver un fichier (genre test13.cpp) où je vais taper le code des fonctions que je vais mettre dans ma librairie. Je ne le trouve pas : VS ne l'a pas créé. Tu me dis de "partir d'un projet vide". Comment ? J'ai cliqué sur Nouveau->projet->CLR->Projet vide CLR ; j'ai donné le nom "bidon". A présent, la "solution" test13, contient deux "projets" : test13 et bidon ! L'explorateur Windows me dit que dans le dossier "test13", a été créé un sous-dossier bidon, qui contient un fichier bidon.vcproj et c'est tout. Par contre, dans la fenètre de VS est apparu, de manière légèrement différente un "projet" bidon avec trois petits rectangles jaunes (qui évoquent des sous-dossiers) intitulés "fichiers d'entete", fichiers ressources" et "fichiers sources". Mais toujours pas de test13.cpp ! Et cliquer sur ces trois petits rectangles n'a absolument aucun effet !
    Je ne sais toujours pas où je vais placer les trois lignes du code de ma fonction "mafonction" !!!

    Entre parenthèses, je n'ai pas compris ce qu'est une "solution", un "projet", pas plus que ce que signifie de cliquer sur "générer"

    Je te remercie beaucoup du temps que tu as passé à me répondre de manière extensive. Pour être moi-même conseilleur sur d'autres forums d'aide dans ma spécialité (qui n'est pas C++ - ce n'est pas un scoop !), je sais que cela prend beaucoup de temps. Je t'en suis par conséquent très reconnaissant. Je crains malheureusement que je n'aie pas encore fini de t'embêter avec mes questions...

    Merci mille fois !

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par ceugniet Voir le message
    Je n'ai pas dit que mon fichier test13.h n'était pas compilé ; j'ai dit qu'il n'existait pas.
    Oui, c'est à toi de les rajouter. Sur certains wizards VS, ces fichiers "vides" sont créés (notamment avec les DLL), mais pas toujours. De toutes façons, ce n'est qu'un cadre : rien ne t'empêche d'ajouter tous les fichiers (.H ou .CPP) que tu veux.

    Citation Envoyé par ceugniet Voir le message
    Au demeurant, je trouve que cette expression "fichiers d'entête précompilés" est malheureuse. Le fichiers ne sont pas "précompilés" et ils ne seront pas davantage compilés ultérieurement. Ce sont les fonctions référencées dans ces fichiers qui ont été préalablement compilées, pas les fichiers, pas les entêtes ! Mais peut-être ai-je mal interprêté encore...
    Et pourtant, si, ils sont bel et bien précompilés... C'est à dire que le compilateur va préprocesser et précompiler le maximum de données possible depuis un "point d'entrée" (StdAfx.h en général), c'est à dire le fichier racine de précompilation (ce point d'entrée) et TOUS les entêtes qu'il référence.
    Le temps gagné l'est principalement sur la phase de lecture des fichiers .H unitaires (on ne lit qu'un seul fichier, le .PCH [PreCompiled Headers]), de préprocess (c'est déjà fait), d'analyse lexicale / sémantique (c'est du binaire déjà "valide" et non plus du texte à vérifier), et sur les dépendances (elles sont incluses dans le PCH).

    Citation Envoyé par ceugniet Voir le message
    J'ai cliqué sur Nouveau->projet->CLR->Projet vide CLR ; j'ai donné le nom "bidon".
    Houlà, attention !!! Je t'ai dit de prendre un projet Win32, pas CLR !! CLR, c'est autre chose, c'est du C++ à la sauce .NET.

    Citation Envoyé par ceugniet Voir le message
    Je ne sais toujours pas où je vais placer les trois lignes du code de ma fonction "mafonction" !!!
    Dans des fichiers .H / .CPP que tu vas crééer, et ajouter (par drag & drop notamment) à ton projet. Ils vont se classer automatiquement dans les filtres de projet (les "pseudo-répertoires" que tu vois, comme "Fichiers d'entête").

    Citation Envoyé par ceugniet Voir le message
    Entre parenthèses, je n'ai pas compris ce qu'est une "solution", un "projet", pas plus que ce que signifie de cliquer sur "générer"
    Projet (extension .vcproj) : éléments permettant de compiler UN élément binaire. Un EXE, une DLL, une LIB, etc. Un projet ne peut pas (en situation normale) permettre de générer plus d'un objet de sortie "final" (EXE, DLL, LIB, ...). Donc, tu devras avoir un projet pour ton EXE, et un autre pour ta librairie.
    Solution (extension .sln) : Ensemble de projets reliés ensemble, notamment via les dépendances.
    Générer : compiler une solution ou un projet. Tu as une entrée de menu "Générer", justement.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. Utiliser une bibliothèque statique ?
    Par divide dans le forum Débuter
    Réponses: 1
    Dernier message: 05/12/2012, 14h25
  2. Réponses: 0
    Dernier message: 06/02/2009, 22h08
  3. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  4. Réponses: 1
    Dernier message: 18/06/2007, 16h10
  5. Utiliser une bibliothèque statique
    Par djflex68 dans le forum MFC
    Réponses: 6
    Dernier message: 15/08/2005, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo