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 :

Probleme de link


Sujet :

Visual C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut Probleme de link
    Bonjour,

    J'ai un peit probleme de lien que j'arrive pas a corriger/comprendre.

    J'ai un projet qui me fourni une dll et une librairie avec cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //prototype
    __declspec(dllexport) BSTR Copy(const BSTR string);
    Dans un autre projet j'utilise cette fonction ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BSTR c1;
    //BSTR c2; initialise avant
    c1 = Copy(c2);
    J'ai bien mis les options de compilation:
    link(nom, chemin...)

    Et pourtant j'obtiens cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned short * __cdecl Copy(unsigned short * const)" (__imp_?Copy@@YAPAGQAG@Z)
    Je comprend pas pourquoi il ne la trouve pas, d'autant que dans d'autre projet ca marche.
    De plus je ne comprend pas qu'il cherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copy(unsigned short * const)
    et non pas:
    Alors que dans mon appel je lui passe bien une BSTR.

    Information:
    La premiere dll(qui definit copy()) est compile sous VC2005.
    La deuxieme dll(qui utilise copy()) est compile sous VC6.
    Je pense que ca peut venir de la mais je seche completement, et je trouve rien dans l'aide msdn.

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Edit : au temps pour moi, j'ai mal lu

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    La DLL est-elle en C ou en C++ ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    En C++, les deux.
    nico-pyright(c): pas vu

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Jette un coup d'oeil dans la DLL avec Dependency Walker (depends.exe) pour voir comment exactement est exportée la fonction...

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    d'accord par contre pourrait-tu m'aider a comprendre...
    Voila j'ai mis 2 images(une vue generale et un detail).

    donc bien sur on parle bien de la dll qui exporte la fonction, car la deuxieme ne se genere pas.

    Voila si tu peut deja m'expliquer ce que je dois comprendre et me dire si tu vois des erreurs?
    Merci

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Eh bien, elles n'ont pas le même nom, il est donc probable que ce ne soit pas la même fonction.
    Active l'option de dependency walker "undecorate c++ functions" (prends une version plus récente de dependency walker si tu ne la trouves pas, ou bien utilise l'outil C++ name undecorator (undname.exe))...

    Edit: Je m'en suis chargé:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    C:\Program Files\Microsoft Visual Studio 8\VC\bin>undname ?Copy@@YAPA_WQA_W@Z ?Copy@@YAPAGQAG@Z
    Microsoft (R) C++ Name Undecorator
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    Undecoration of :- "?Copy@@YAPA_WQA_W@Z"
    is :- "wchar_t * __cdecl Copy(wchar_t * const)"
    
    Undecoration of :- "?Copy@@YAPAGQAG@Z"
    is :- "unsigned short * __cdecl Copy(unsigned short * const)"
    Selon les options, wchar_t et unsigned short peuvent être deux types différents sur un Visual récent.
    Normalement, si tu recompiles la DLL et le programme sur le même compilo et avec les mêmes options, ça devrait marcher.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Ben j'utilise la version de VC6(installer avec) de Dependacy Walker.
    Je vais voir si j'en trouve un plus recent car je ne trouve pas non plus l'option dont tu parle.

    Par contre a quoi vois-tu qu'elles n'ont pas le meme nom?
    en fait je connais pas trop ce logiciel.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    J'ai édité mon post.

    Au passage, il est rare de faire des fonctions avec interface C++ dans une DLL, surtout parce que ce n'est pas compatible d'un compilateur à l'autre.
    Tu devrais exporter tes fonctions en extern "C"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef EXTERN_C
    #ifdef __cplusplus
    #define EXTERN_C extern "C"
    #else
    #define EXTERN_C extern
    #endif
    #endif
     
    //prototype
    EXTERN_C __declspec(dllexport) BSTR Copy(const BSTR string);

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    Yes, juste le temp de recupere Dependacy(t'avais deja trouver lol).

    Alors j'ai recuperer la derniere version(pour ceux qui savent pas: il est gratuit).

    J'obtiens donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wchart_t* Copy(wchart_t* const)
    La meme chose que Médinoc.

    Alors sinon ben oui c'est du C++ mais je peut pas modifier la premiere dll(deja utilise).

    Alors si je résume ce que j'ai compris:
    Dans ma premiere dll compile avec Visual C++ 2005:
    BSTR Copy(const BSTR)
    devient
    wchart_t* Copy(wchart_t* const)

    Et dans ma deuxieme dll compile avec Visual C++ 6, l'appel de
    BSTR Copy(maBSTR)
    demande une fonction
    unsigned short Copy(unsigned short * const)
    qu'il ne trouve pas!

    Donc apparamment les BSTR ne sont pas defini de la meme maniere dans l'un ou l'autre compilo.

    [Edit]suppression de texte: c'etait n'imp[/Edit]

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Points : 240
    Points
    240
    Par défaut
    OK!

    D'abord merci pour ton aide ca m'a permit d'y voir plus clair, c'est sympa .
    Je vais voir ce que je peut envisager comme solution.

    La premiere qui me vient a l'esprit est:
    Puisqu'il ne trouve pas les fonctions ailleurs autant les ajouter dans son projet!
    Ca genera pas les autres dll, et lui il devrait etre content.

    M'en vais essayer!
    A+

Discussions similaires

  1. probleme de link
    Par Volazara dans le forum MFC
    Réponses: 1
    Dernier message: 22/12/2005, 15h26
  2. [MFC]probleme de link
    Par benahpets dans le forum MFC
    Réponses: 4
    Dernier message: 12/08/2005, 10h56
  3. [newbie][virtual] probleme de link
    Par BainE dans le forum MFC
    Réponses: 1
    Dernier message: 01/06/2005, 18h21
  4. probleme de link avec visual studio .net 2003
    Par kamal101 dans le forum MFC
    Réponses: 9
    Dernier message: 28/03/2005, 22h44
  5. [dev-cpp] probleme de link
    Par alex1er dans le forum Dev-C++
    Réponses: 5
    Dernier message: 20/01/2005, 18h41

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