none
unresolved external sur un vecteur de int RRS feed

  • Question

  • Je commence tout juste a utiliser Visual C++ alors j'ai probablement fait une erreur basique mais je trouve pas de solution. 

    J'ai créer un projet vide, j'y ai ajouté un fichier main.cpp :
    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std ;
    
    int main (int argc, char **argv) 
    {
    	string test ("test string") ;
    	vector <int> vec (2, 0) ;
    
    	cout << vec [0] << test [1] << endl ;
    
    	return 0 ;
    }
    et je me retrouve avec une erreur de linker :

    main.obj : error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in function "public: int & __thiscall std::vector<int,class std::allocator<int> >::operator[](unsigned int)" (??A?$vector@HV?$allocator@H@std@@@std@@QAEAAHI@Z)

    et du coup je peut pas éxécuter le programme.

    La ou sa devient franchement bizarre c'est que en recréant un nouveaux projet avec éxactement les mêmes options ca marche sans problème. 


    Alors d'ou viens l'errreur ? 

    Merci d'avance pour votre aide.
    mardi 29 septembre 2009 17:22

Toutes les réponses

  • Un peu de méthode:

    __imp___CrtDbgReportW
    C'est un nom décoré pour la méthode "_CrtDbgReport".
    http://msdn.microsoft.com/en-us/library/8hyw4sy7(VS.71).aspx

    En fin de la page de documentation MSDN, il y a

    <DOC>

    Libraries

    Debug versions of C run-time libraries only.

    </DOC>

    Vous auriez pas changer les settings du projet pour utiliser une librairie C Release, par hasard ?

    Si "DEBUG" est définit vous devez utiliser soit "Multi-threaded Debug DLL (/MDd)" soit "Multi-threaded Debug (/MTd)" dans l'option suivante dans VS2008:
    Click droit sur le projet -> Properties -> Configuration Properties -> C/C++ -> Code Generation -> (à droite)Runtime Library


    Paul Bacelar, Ex - MVP VC++
    mardi 29 septembre 2009 17:40
    Modérateur
  • <Vous auriez pas changer les settings du projet pour utiliser une librairie C Release, par hasard ?>

    Je suis pas sur de comprendre ce que tu veut dire par ca mais je n'ai pas ajouté de librairies au projet.

    En utilisant "Multi-threaded Debug DLL (/MDd)", un nouveaux message d'erreur apparait :

    mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\libtest.exe.embed.manifest". The parameter is incorrect.

    et en utilisant "Multi-threaded Debug (/MTd)", une longue liste d'erreurs du linker apparait :

    1>main.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,struct std::char_traits<char> > &)" (?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: char & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator[](unsigned int)" (??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_traits<char> > &))" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(int)" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: static bool __cdecl std::char_traits<char>::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: static int __cdecl std::char_traits<char>::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: class std::basic_streambuf<char,struct std::char_traits<char> > * __thiscall std::basic_ios<char,struct std::char_traits<char> >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: __thiscall std::_Container_base_secure::~_Container_base_secure(void)" (??1_Container_base_secure@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: void __thiscall std::_Container_base_secure::_Orphan_all(void)const " (?_Orphan_all@_Container_base_secure@std@@QBEXXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::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> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: char __thiscall std::basic_ios<char,struct std::char_traits<char> >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: int __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: __thiscall std::_Container_base_secure::_Container_base_secure(void)" (??0_Container_base_secure@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: void __thiscall std::basic_ostream<char,struct std::char_traits<char> >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > * __thiscall std::basic_ios<char,struct std::char_traits<char> >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: void __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: void __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in msvcprtd.lib(MSVCP90D.dll)
    1>main.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in msvcprtd.lib(MSVCP90D.dll)

    Merci d'avance.
    mardi 29 septembre 2009 18:37
  • Vous êtes en train de faire des noeuds.

    Quand on change le C-Runtime utilisée, il faut faire une recompilation complète du projet.
    MSVCP90D.dll ne marche qu'avec "Multi-threaded Debug DLL (/MDd)" (http://support.microsoft.com/kb/154419/en-us réponse N°2).
    Je ne sais pas si cette dépendence est lié à une recompilation non-complète ou à d'autre librairie, c'où l'intérêt de faire une recompilation complète.

    Donc, si on prend ""Multi-threaded Debug DLL (/MDd)", mt.exe est utilisé pour la création de manifeste pour les applications .NET ou pour une exécution Side-by-side de composant non managé.

    Etes-vous dans du C++/CLI ou est-ce une fausse manipulation.
    Paul Bacelar, Ex - MVP VC++
    mercredi 30 septembre 2009 07:47
    Modérateur
  • Le problème était bien du a une recompilation incomplète du projet. Merci.

    Par contre comment est ce que je peux changer le runtime ?

     J'ai un projet qui utilise une librarie en C et qui est compilé avec "msvcrt.lib" ce qui cause des problèmes avec les éléments de C++ du projet.  Comment est ce que je peut imposer d'utiliser le runtime C++ ?

    encore une fois merci d'avance pour ton aide.
    mercredi 30 septembre 2009 10:36
  • Je comprends pas trop la question.

    Il n'existe que des C-Runtime, il n'y a pas de runtime C++ mais des librairies et des dll pour l'implémentation des fonctionnalités C++ standard.
    Chacune de ces librairies et dll utilise une et une seule version de la runtime C (pas C++).

    Donc pour modifier la C-Runtime, bon c'est comme indiqué dans le premier post :
    Click droit sur le projet -> Properties -> Configuration Properties -> C/C++ -> Code Generation -> (à droite)Runtime Library

    Une fois la C-Runtime choisie, VisualStudio, via des DEFINE (flags -Dxxxxx), choisit les bonne librairies C++.
    C'est totomatique. ;-)

    Quand vous parlez de "librarie en C", il s'agit de librairies statiques, avec ou sans le code sources, de librairie de dl avec ou sans le code source ?

    S'il s'agit de librairies statiques avec le code source, le plus simple est de changer la C-Runtime dans le projet de compilation de la lib.
    S'il s'agit de librairies statiques sans le code source, là vous êtes dans une fâcheuse posture si le fournisseur de la librairie n'a pas fournis plusieurs versions de la librairie en fonction de la C-Runtime utilisé. Vous pouvez changer la C-Runtime de votre composant logiciel pour qu'il utilise la même que celle de la librairie en espérant que vous ne tomberez pas une incompatibilité entre plusieurs librairies aussi mal fichues. Si c'est le cas, il faudra isoler ces librairies statiques dans des librairies dynamiques qui permettent un cloisonnement entre la C-Runtimes utilisée par l'exécutable et les différentes C-Runtimes utilisée par les autres dll.

    S'il s'agit de librairies dynamique, si l'API da la dll est bien faite, vous pouvez utiliser des C-Runtimes différentes entre votre module et cette dll. Si vous avez quand même un problème, postez le .h de la dll pour voir s'il n'y pas de grosses boulettes dans cette API.
    Paul Bacelar, Ex - MVP VC++
    mercredi 30 septembre 2009 11:50
    Modérateur