none
Lib unresolved RRS feed

  • Question

  • J'ai converti mes lib en suivant la procédure décrite dans le thread.

    mais au link les éléments qui sont dans les lib sortent en unresolved

    J'ai entendu dire que sous Visual le référencement de lib demandait plusieurs opérations

    ou ces opérations sont elles décrites?


    Jean Noël Martin


    vendredi 25 mai 2012 17:21

Réponses

Toutes les réponses

  • le lien avec le thread est donné ici

    Jean Noël Martin

    mardi 29 mai 2012 10:17
  • La procédure n'est viable qu'avec des lib de Dll.

    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse Ciprian Duduiala jeudi 31 mai 2012 07:03
    • Non marqué comme réponse JeanNoel53 mercredi 6 juin 2012 09:59
    mardi 29 mai 2012 10:34
    Modérateur
  • Mais comment sont générées les lib, on m'avait recommandé de passer par les def;Quel est la procédure pour avoir les bonne lib

    Jean Noël Martin

    mercredi 6 juin 2012 10:00
  • C'est quoi la question précisément ?

    Quand on fait une Dll avec VS à  partie du code source, vous avez plusieurs possibilités pour spécifier la liste des fonctions exportées par la Dll, dont le fichier .def.

    Avec cette liste, VS génère un fichier .lib qui ne contient que des fonctions "stubs" qui ne font qu'appeler les fonctions dans la Dll. Le code de la lib est intégré dans l'exécutable et le code du stub utilise une indirection pour retrouver l'adresse de la fonction dans la Dll car la Dll peut être chargée n'importe où en mémoire.

    L'astuce du .def, c'est que vous n'avez pas besoin du code source de la Dll pour généré ces fonctions "stubs" dans la lib mais juste des noms. Donc en remplissant convenablement un fichier .def vous génèrerez un fichier .lib contenant les mêmes fonctions "stubs" qui si ce fichier .lib avait généré en même temps que la Dll.

    Vous semblez connaitre l'exécutable "lib", donc vous pouvez générer les lib. C'est exactement les mêmes que ceux générés lors de la compilation de la Dll.

    Il faut donc juste ajouter ces lib ainsi créées à la liste des lib à utiliser par votre projet utilisateur de la Dll lors d' l'édition de lien.

    click droit sur le projet utilisateur dans l'explorateur de solution -> Propriétés -> Propriétés de configuration -> Editeur de lien -> entrée ->Dépendances supplémentaire -> Y AJOUTER LE NOM DE OU DES LIBS GENEREES

    Si ces libs ne sont pas avec les autre libs du projet :

    click droit sur le projet utilisateur dans l'explorateur de solution -> Propriétés -> Propriétés de configuration -> Editeur de lien -> Général -> Répertoires de bibliothèques supplémentaires -> Y METTRE LES CHEMINS VERS LES REPERTOIRES CONTENANT LES LIBS.

    Tout cela peut être ok mais cela peut ne pas marcher si les fichiers d'en-tête (.h) sont mal conçus.

    Si cela ne marche pas, il nous faudrait

    1- le message d'erreur précis lors de l'édition de lien du projet utilisateur.

    2- la ligne du .h contenant la définition de la fonction ou des fonctions qui posent problèmes

    3- la sortie console du programme DUMPBIN sur la ou les libs (ou un extrait affichant le ou les fonctions qui posent problèmes)


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 vendredi 8 juin 2012 05:56
    • Non marqué comme réponse JeanNoel53 jeudi 14 juin 2012 17:57
    jeudi 7 juin 2012 16:11
    Modérateur
  • J'ai suivi pas a pas la procédure très bien documenté ci dessus et ça n'a rien changé: beaucoup des symboles spécifiés dans les .def  sont diagnostiqués par le linker avec les diagnostiques suivants :

    ParserManager.obj : error LNK2019: symbole externe non résolu "char * __cdecl WorkTagger(char *)" (?WorkTagger@@$$FYAPADPAD@Z) référencé dans la fonction "public: unsigned __int64 __thiscall CParserManager::Brill_ParseBloc(wchar_t *,struct stAnalysedWord *,unsigned long *,long)" (?Brill_ParseBloc@CParserManager@@$$FQAE_KPA_WPAUstAnalysedWord@@PAKJ@Z)

    voila le fichier de définition

    LIBRARY     TAGGERCDLL.DLL

    EXPORTS
        @@Memory@Finalize              @8   ; __linkproc__ Memory::Finalize
        @@Memory@Initialize            @7   ; __linkproc__ Memory::Initialize
        @@Strconv@Finalize             @6   ; __linkproc__ Strconv::Finalize
        @@Strconv@Initialize           @5   ; __linkproc__ Strconv::Initialize
        @@Taggercdll@Finalize          @2   ; __linkproc__ Taggercdll::Finalize
        @@Taggercdll@Initialize        @1   ; __linkproc__ Taggercdll::Initialize
        @BTagger_setup$qv              @3   ; BTagger_setup()
        @WorkTagger$qpc                @4   ; WorkTagger(char *)
        ___CPPdebugHook                @9   ; ___CPPdebugHook

    peut être est ce du a l’absence du mot clef __cdecl. il semble que ce mot soit introduit par le linker à tort dans ses attentes. je pense à une option non documenté du link

    il semble cependant qu'il y ait plusieurs diagnostic de même ordre mais de statut différent:

    1>all_in_one.obj : error LNK2028: jeton non résolu (0A000AD3) "extern "C" long __stdcall RegOpenKeyExA(struct HKEY__ *,char const *,unsigned long,unsigned long,struct HKEY__ * *)" (?RegOpenKeyExA@@$$J220YGJPAUHKEY__@@PBDKKPAPAU1@@Z) référencé dans la fonction "public: struct ibpp_internals::GDS * __thiscall ibpp_internals::GDS::Call(void)" (?Call@GDS@ibpp_internals@@$$FQAEPAU12@XZ)

    1>all_in_one.obj : error LNK2019: symbole externe non résolu "extern "C" long __stdcall RegCloseKey(struct HKEY__ *)" (?RegCloseKey@@$$J14YGJPAUHKEY__@@@Z) référencé dans la fonction "public: struct ibpp_internals::GDS * __thiscall ibpp_internals::GDS::Call(void)" (?Call@GDS@ibpp_internals@@$$FQAEPAU12@XZ)

    ces messages réfèrent le code de ibpp qui est un framework: qui revendique un extern C  pour une adresse qui ressemble à une syntaxe c++;

    1>chunker.obj : error LNK2028: jeton non résolu (0A0001D4) "public: __thiscall COption::~COption(void)" (??1COption@@$$FQAE@XZ) référencé dans la fonction "void __clrcall `dynamic atexit destructor for 'Option''(void)" (???__FOption@@YMXXZ@?A0x41c9b8f6@@$$FYMXXZ)

    1>segmentation.obj : error LNK2028: jeton non résolu (0A00016F) "public: static unsigned __int64 __cdecl COption::GetStringList(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::list<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::allocator<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > > >,class std::list<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,class std::allocator<class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > > > *)" (?GetStringList@COption@@$$FSA_KV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@0V?$list@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@V?$allocator@V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@@3@PAV43@@Z) référencé dans la fonction "public: __thiscall CSegmentation::CSegmentation(void)" (??0CSegmentation@@$$FQAE@XZ)

    voici le def correspondant:

     @COption@$bctr$qv              @1   ; COption::COption()
        @COption@$bdtr$qv              @2   ; COption::~COption()
        @COption@GetBooleanValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1opo @7   ; COption::GetBooleanValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, bool, bool *)
        @COption@GetListOfValue$qp73_STL@%list$19stOPTIONEXSTRUCTURE38_STL@%allocator$19stOPTIONEXSTRUCTURE%% @6   ; COption::GetListOfValue(_STL::list<stOPTIONEXSTRUCTURE, _STL::allocator<stOPTIONEXSTRUCTURE> > *)
        @COption@GetShortValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1sps @8   ; COption::GetShortValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, short, short *)
        @COption@GetStringList$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1161_STL@%list$63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%82_STL@%allocator$63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$ymwX @14  ; COption::GetStringList(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, ...
        @COption@GetStringValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1t1p63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%% @5   ; COption::GetStringValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL
        @COption@GetUIntValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1uipui @4   ; COption::GetUIntValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, unsigned int, unsigned int *)
        @COption@LoadOptions$qv        @3   ; COption::LoadOptions()
        @COption@SaveOptions$qv        @13  ; COption::SaveOptions()
        @COption@SetBooleanValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1o @9   ; COption::SetBooleanValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, bool)
        @COption@SetListOfValue$q73_STL@%list$19stOPTIONEXSTRUCTURE38_STL@%allocator$19stOPTIONEXSTRUCTURE%% @12  ; COption::SetListOfValue(_STL::list<stOPTIONEXSTRUCTURE, _STL::allocator<stOPTIONEXSTRUCTURE> >)
        @COption@SetStringValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1t1 @11  ; COption::SetStringValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL
        @COption@SetUIntValue$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%%t1ui @10  ; COption::SetUIntValue(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, _STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >, unsigned int)

    quant à ces messages ils réfèrent explicitement un objet c++;

    1>schedulerGlobal.obj : error LNK2028: jeton non résolu (0A000245) "public: unsigned __int64 __thiscall CDocumentManager::ReadBloc(class CBloc *)" (?ReadBloc@CDocumentManager@@$$FQAE_KPAVCBloc@@@Z) référencé dans la fonction "public: unsigned __int64 __thiscall CSchedulerGlobal::GlobalAnalyse(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,enum enDocType,enum enApplicationName,class CMDBManager *)" (?GlobalAnalyse@CSchedulerGlobal@@$$FQAE_KV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@W4enDocType@@W4enApplicationName@@PAVCMDBManager@@@Z)

    de même que celui ci.

    1>schedulerGlobal.obj : error LNK2028: jeton non résolu (0A000262) "void __cdecl BTagger_setup(void)" (?BTagger_setup@@$$FYAXXZ) référencé dans la fonction "public: unsigned __int64 __thiscall CSchedulerGlobal::GlobalAnalyse(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >,enum enDocType,enum enApplicationName,class CMDBManager *)" (?GlobalAnalyse@CSchedulerGlobal@@$$FQAE_KV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@W4enDocType@@W4enApplicationName@@PAVCMDBManager@@@Z)

    dont voici le def

        @CDocumentManager@CloseDocument$qv @43  ; CDocumentManager::CloseDocument()
        @CDocumentManager@GoNextBloc$qro @45  ; CDocumentManager::GoNextBloc(bool&)
        @CDocumentManager@InitializePointBloc$qro @44  ; CDocumentManager::InitializePointBloc(bool&)
        @CDocumentManager@OpenDocument$q63_STL@%basic_string$b20_STL@%char_traits$b%18_STL@%allocator$b%% @42  ; CDocumentManager::OpenDocument(_STL::basic_string<wchar_t, _STL::char_traits<wchar_t>, _STL::allocator<wchar_t> >)
        @CDocumentManager@ReadBloc$qp5CBloc @46  ; CDocumentManager::ReadBloc(CBloc *)
        @CDocumentManager@StartReader$q9enDocType @40  ; CDocumentManager::StartReader(enDocType)
        @CDocumentManager@StopReader$qv @41  ; CDocumentManager::StopReader()

    on a encore un cdecl pour un objet c++.

    1>ParserManager.obj : error LNK2028: jeton non résolu (0A00010E) "void __cdecl BTagger_setup(void)" (?BTagger_setup@@$$FYAXXZ) référencé dans la fonction "public: unsigned __int64 __thiscall CParserManager::InitParserManager(enum enLanguage)" (?InitParserManager@CParserManager@@$$FQAE_KW4enLanguage@@@Z)

    dont voici le def

        @@Memory@Finalize              @8   ; __linkproc__ Memory::Finalize
        @@Memory@Initialize            @7   ; __linkproc__ Memory::Initialize
        @@Strconv@Finalize             @6   ; __linkproc__ Strconv::Finalize
        @@Strconv@Initialize           @5   ; __linkproc__ Strconv::Initialize
        @@Taggercdll@Finalize          @2   ; __linkproc__ Taggercdll::Finalize
        @@Taggercdll@Initialize        @1   ; __linkproc__ Taggercdll::Initialize
        @BTagger_setup$qv              @3   ; BTagger_setup()
        @WorkTagger$qpc                @4   ; WorkTagger(char *)
        ___CPPdebugHook                @9   ; ___CPPdebugHook

    de même dans celui ci.

    J'ai ainsi 42 externes non résolus/ j'ai mis un a deux exemples de chaque diagnostique représentatif d'un groupe:

    il y a un grand nombre de cdecl et quelques autres ou il semble que ce soit la syntaxe d'appel qui soit en cause.


    Jean Noël Martin






    jeudi 14 juin 2012 18:06
  • Ce thread est mort; la suite a été reportée dans l'autre thread.

    Jean Noël Martin


    • Marqué comme réponse JeanNoel53 vendredi 15 juin 2012 17:02
    • Modifié JeanNoel53 samedi 16 juin 2012 09:20
    vendredi 15 juin 2012 17:02