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 :

[Visual C++ 2010] Problème pour linker une librairie


Sujet :

Visual C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut [Visual C++ 2010] Problème pour linker une librairie
    Bonjour à tous,

    Je ne maîtrise pas encore très bien l'ajout de librairies à un projet et je n'arrive pas à linker la librairie de PostgreSQL.
    J'ai procédé de cette façon :

    - Projet > Propriétés > Editeur de liens > Général : Ici, je mets le PATH qui mène au fichier libpq.lib;
    - Projet > Propriétés > Editeur de liens > Entrée : Ici, je mets le nom de la librairie : libpq.lib;
    - Explorateur de solutions > Clic droit sur le projet > Ajouter un élément existant > libpq.lib;

    Je ne sais pas si la 3ème étape est nécessaire, mais je m'y était pris exactement de cette façon pour la librairie MySQL (libmysql.lib) et sa fonctionnait.

    Pour info je développe un programme qui communique avec plusieurs SGBD, et je n'ai pas du tout la main sur le serveur de l'utilisateur (car j'ai bien essayé de mettre - en mode violent - la librairie dans le PATH Windows, mais sa ne me satisfait pas comme solution, en plus d'être problématique pour mon projet).

    Quant au message d'erreur il est clair :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    libpq.dll: Le module spécifié est introuvable.
    pq.dll: Le module spécifié est introuvable.
    Merci d'avance!

  2. #2
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Visiblement ta compilation se passe bien, mais c'est au démarrage du code que ça plante, non ?

    J'ai cette impression à cause des messages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    libpq.dll: Le module spécifié est introuvable.
    pq.dll: Le module spécifié est introuvable.
    Tu ne devrais pas en arrivé là avant l'exec.

    Si c'est le cas, c'est tout simplement que tes 2 DLLs ne sont pas accessibles.
    Il faut soit que tu les enregistre dans windows, soit que tu en mette une copie dans ton dossier d’exécution.

    A+
    Ju

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Salut et merci pour ta réponse Djuju,

    En effet, il fallait bien que j'ajoute les dll dans le dossier de mon projet, c'est donc cette étape que j'avais zappée!
    Je vais noter sa quelque part pour pas oublier.

    Par contre, dernière petite question, pour PostgreSQL par exemple, je dois ajouter au total 5 dll pour que mon projet communique avec une base de données, ce qui peut être un peu lourd je trouve (surtout si je dois gérer d'autres SGBD qui demandent à leur tour des dll).

    Quand tu dis les ajouter dans Windows, si je n'ai pas la main sur le serveur de l'utilisateur, il m'est impossible de le faire. Donc existe-t-il un autre moyen de procéder?

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Je reviens à la charge,

    En fait mon soucis est toujours là.
    Lors de l'exécution, un message d'erreur Windows s'affiche : Impossible de démarrer le programme car il manque XX.dll sur votre ordinateur.

    Pour résumer, j'ai essayé de :

    - Linker la librairie à mon projet (Editeur de liens > entrée > dépendances supplémentaires);
    - Ajouter le .lib à mon projet (Ajouter élément existant);
    - Ajouter le .dll à mon projet (Ajouter élément existant);
    - Placer le .dll dans le dossier de mon projet (à côté des fichiers .cpp et .h);

    Rien n'y fait.
    Je précise que j'utilise une VM pour émuler le serveur de l'utilisateur (donc j'ai sur cette VM uniquement les SGBD d'installés). Et je souhaite pouvoir démarrer mon programme sans avoir besoin d'installer ces dll sur ma VM (il faudrait donc qu'elles soient liées à mon projet).

    Bizarrement, je ne trouve aucun tuto sur internet quant aux étapes à suivre pour faire ceci! :/

    Merci d'avance!

  5. #5
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Tes DLL doivent être avec tes exe, pas avec les sources. Typiquement, c'est le dossier debug et release.

    Si j'ai bien compris, tes DLL sont les librairies de connexion a ton serveur, donc elles n'ont pas besoin d'être sur le serveur.

    Si tu ne veux pas trainer tes DLL avec ton exe, il faut que tu utilise une lib static. Le code contenu dans tes DLL sera alors lié a ton exe et tu te débarrassé de fameuses DLL.
    Ceci dit, la taille de ton exe va gonfler et les static lib doivent être disponibles ou compilables a partir des sources.

    D'une façon généralement c'est très acceptable des trainer des DLL avec ton code. Si elles sont utiliser par plusieurs appli, c'est préférable de les enregistrer dans windows. Ça évite d'en avoir plusieurs copies, alors qu'une est suffisante.

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Ok je te remercie,

    Donc les librairies statiques!
    J'utilise une API qui me permet de me connecter aux SGBD (cette API se sert ensuite des librairies de chaque SGBD).
    Dans la release de cette API, j'ai bien une librairie statique, mais lorsque je la link au projet et que je compile, j'ai pas mal d'erreurs de liens. Exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error LNK2001: symbole externe non résolu ___mb_cur_max
    error LNK2001: symbole externe non résolu "public: int __thiscall SAString::Insert(int,char const *)" (?Insert@SAString@@QAEHHPBD@Z)
    Etc, etc, j'en ai pas mal.
    La release de l'API est aussi accompagnée de fichiers .pdb (je pense que sa doit être sa qui permet d'éviter les erreurs de symboles). Par contre, je ne sais pas comment lier un fichier .pdb à mon projet (j'ai fouillé dans les propriétés du projet, je n'ai rien trouvé de concret).

  7. #7
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Les pdb sont seulement les fichier de symboles pour le debug de ta lib.

    Par contre, j'avais oublié un détail important si tu utilise des lib statiques: c'est à toi de faire l'édition des liens de ta static lib avec ses dépendances.
    Autrement dit, si ta static lib utilise d'autres libs (on dit qu'elle a des dépendance vers d'autres libs), c'est à toi d'ajouter ces dépendance dans les options du linker de ton projet. C'est bien sur un peu plus lourd à mettre en place

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Encore merci pour ton aide.

    Cependant, je n'arrive pas à passer outre ces 10 messages d'erreurs concernant des "externes non résolus".

    Lorsque je passe de la librairie dynamique à statique, je gagne 7 nouvelles erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1>sqlapis.lib(SQLAPI.obj) : error LNK2001: symbole externe non résolu ___mb_cur_max
    1>sqlapis.lib(oraClient.obj) : error LNK2001: symbole externe non résolu ___mb_cur_max
    1>sqlapis.lib(ISAClient.obj) : error LNK2001: symbole externe non résolu ___mb_cur_max
    1>sqlapis.lib(ssOleDbClient.obj) : error LNK2001: symbole externe non résolu ___mb_cur_max
    1>sqlapis.lib(samisc.obj) : error LNK2001: symbole externe non résolu _GetFileVersionInfoA@16
    1>sqlapis.lib(samisc.obj) : error LNK2001: symbole externe non résolu _GetFileVersionInfoSizeA@8
    1>sqlapis.lib(samisc.obj) : error LNK2001: symbole externe non résolu _VerQueryValueA@16
    Et depuis que j'ai remplacé la librairie dynamique par la librairie statique, j'ai 3 nouvelles erreurs (dont je n'arrive pas à me débarrasser, même en revenant à la librairie dynamique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1>SaveSQL.obj : error LNK2001: symbole externe non résolu "public: int __thiscall SAString::Insert(int,char const *)" (?Insert@SAString@@QAEHHPBD@Z)
    1>SaveSQL.obj : error LNK2001: symbole externe non résolu "public: int __thiscall SAString::Replace(char const *,char const *)" (?Replace@SAString@@QAEHPBD0@Z)
    1>SaveSQL.obj : error LNK2001: symbole externe non résolu "public: int __thiscall SAString::GetLength(void)const " (?GetLength@SAString@@QBEHXZ)
    J'imagine bien qu'en ne connaissant pas l'API, et n'étant pas devant, sa ne doit pas être évident de savoir qu'est-ce qui ne va pas, mais si tu as une idée, je bloque là. :/

  9. #9
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Ok, j'ai pas été clair.

    Le compilateur échoue car car il ne trouve pas un paquet de fonctions (celles listé en erreur).
    Ces fonctions sont nécessaires pour utiliser la lib de PostgreSQL.
    Une DLL est un code compilé dont l'édition de liens a été faite. Donc, pas besoin de donné accès au lib qui contienne ces fonctions puisqu’elles ont été embarquées dans ta DLL.
    Une static lib est un code compilé, mais dont l'édition de liens n'a pas été faite. Donc dès qu'une fonction de ta static lib fait appel a une fonction externe (une fonction qui se trouve dans une autre lib), tu dois fournir le code qui correspond à cette fonction. Sinon l'édition de liens va échouer.

    D'ailleurs tu remarquera que toutes tes erreur sont de type LNK, soit des erreur d'édition de lien et non de compilation.

    Un certain nombre de lib nécéssaires à l'utilisation de la lib statique de PostgreSQL ne sont donc pas incluses dans ton projet.

  10. #10
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Salut Djuju,

    Merci pour tes explications, c'est beaucoup plus clair maintenant pour moi.
    J'ai résolu mes problèmes, en fait mes librairies étaient bien linkées (après tes premières explications), mais le soucis venait d'une option de compilateur VisualStudio : Génération de Code / Bibliothèque Runtime, qui était positionnée sur DLL Multithread (/MD) et que j'ai passé en Multithread (/MT).

    Il y a encore pas mal d'options du compilateur que je ne maitrise pas du tout, j'espère que j'aurais pas trop de soucis comme sa, m'enfin sa me fait découvrir!

    Je passe le post en résolu, merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Linker une librairie visual avec g++ sous windows 7 64
    Par falcoman33 dans le forum C++/CLI
    Réponses: 11
    Dernier message: 06/05/2014, 07h01
  2. [Visual C# 2010] Regex pour recuperer une balise
    Par poupou63 dans le forum C#
    Réponses: 1
    Dernier message: 26/07/2011, 15h39
  3. Réponses: 1
    Dernier message: 20/12/2010, 22h43
  4. Problème pour linker la lib d'une Dll
    Par damien99 dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 23/02/2006, 23h20
  5. Problème pour lier une librairie... (ANTLR)
    Par loupdeau dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 10h12

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