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 :

Problème de liens avec utilisation de dll


Sujet :

Visual C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème de liens avec utilisation de dll
    Bonjour,
    J'essaye de construire un dll et exporte une fonction simple et l'appeler dans un autre projet Windows. myProject est le project windows qui appelle mon dll. Le dll utilise une classe qui s'appelle CGIData qui possède une fonction static AdD.

    Pour info, j'utilise Visual studio C++ 2008.

    Je pense avoir lié comme il faut mon dll. Mais apparemment je rate qqch. Voilà mon erreur:
    1>Projet non sélectionné dans le cadre d'une génération pour cette configuration de solution
    2>------ Début de la génération*: Projet*:myProject, Configuration*: Release x64 ------
    2>Compilation en cours...
    2>stdafx.cpp
    2>Compilation en cours...
    2>myProject.cpp
    2>Édition des liens en cours...
    2>myProject.obj : error LNK2001: symbole externe non résolu "public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl CGIData::Add(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?Add@CGIData@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V23@0@Z)
    2>C:\myProject\bin\x64\Release\myProject.exe : fatal error LNK1120: 1 externes non résolus
    2>Le journal de génération a été enregistré à l'emplacement "file://c:\myProject\inter\x64\Release\BuildLog.htm"
    2>myProject - 2 erreur(s), 0 avertissement(s)
    ========== Génération*: 0 a réussi, 1 a échoué, 0 mis à jour, 1 a été ignoré ==========
    Est-ce que quelqu'un a une idée de ce que je devrais faire pour corriger cette erreur?
    Merci,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 141
    Points : 12 245
    Points
    12 245
    Par défaut
    Les habitués de ce forum connaissent déjà mon opinion sur l’exportation ce classe C++ depuis des dll, c’est pourri, très pourri.

    Mais bon, on apprend de ses erreurs.

    Donc, le problème, c’est que vous n’avez pas indiqué au compilateur et à l’éditeur de lien que la classe et la méthode statique doivent être exportées (visible de l’extérieur).
    C’est un mécanisme assez complexe mais que M$ a beaucoup simplifié dans VS grace à l’utilisation d’une macro et d’une constante de compilation.

    Je n’ai pas VS2008 mais VS2010, mais les détails du procédé n’ont pas du beaucoup changés. Si vous créez un projet Win32, Dll*, Non Vide*, exportation des Symboles* (les * représente les choix à faire dans l’écran "Application Setting" lors de la création d’un projet Win32), vous êtes sur des rails.
    Avec ces options, VS vous génère des fichiers .h et cpp contenant un exemple de classe, de fonction et de variable qui seront exportées (voir les commentaires dans le cpp).
    L’astuce est de précéder la déclaration et la définition de ces "symboles" (nom de classe, fonction, variable,..) par une MACRO de la forme XXXX_API ou XXXX est fonction du nom de votre dll.
    La MACRO est défini dans le .h et est très courte, en fonction de la définition d’une constante de compilation de la forme XXXX_EXPORTS, soit elle demande au compilateur de générer l’exportation des symboles (quand elle est définie, cas du projet de la dll), soit de considérer que les symboles sont contenue dans la dll (quand la variable n’est pas défini, cas des projet utilisant la dll).

    Donc, soit vous avez oublié d’utilise les bonnes MACRO dans un projet de Dll correctement créé, soit vous avez mal créé le projet.
    Dans le premier cas, c’est simple, ajouter la MACRO XXXX_API devant les symboles à exporter.

    Dans le second cas, vous avez deux options.
    Soit vous créez un nouveau projet avec les options correctes, vous y transférez vos sources et ajouter la MACRO XXXX_API devant les symboles à exporter.
    Soit vous modifiez votre projet dll existant en y ajoutant la définition de la MACRO XXXX_API (générez un projet dll correctement configuré pour avoir le modèle de cette MACRO) et en définissant dans les options du projet de ll la constante correspondant XXXX_EXPORTS.

    Cela semble compliqué, mais c’est très rapide à faire, une foi qu’on a compris le truc.

Discussions similaires

  1. Problème de lien avec struts
    Par gloglo dans le forum Struts 1
    Réponses: 17
    Dernier message: 05/06/2006, 10h08
  2. Problème de lien avec wsock32.dll sous g++ (mingw32)
    Par TheShadow dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 11/04/2006, 14h43
  3. Problèmes de liens avec ODBC vars DB Oracle
    Par kmingaso dans le forum ASP
    Réponses: 1
    Dernier message: 05/09/2005, 09h51
  4. problème de liens avec API sous VC++
    Par xavynfive dans le forum MFC
    Réponses: 7
    Dernier message: 26/08/2005, 12h01

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