Problem mit Bibliotheken

jokey2

Erfahrenes Mitglied
Hallo Leute!

Ich habe hier ein Konsolenprojekt, welches MFC unterstützt. Im gleichen Arbeitsbereich habe ich eine Bibliothek ohne MFC, welche STL-Elemente verwendet. Die Konsolenanwendung soll diese Bibliothek einbinden. Sowohl die Bibliothek als auch die Anwendung lassen sich problemlos kompilieren.
Das Problem tritt beim Linken auf:
Wenn ich meine Applikation linken will, kommen folgende Fehlermeldungen:
Code:
ibcpd.lib(ios.obj) : error LNK2005: "public: void __thiscall std::ios_base::clear(int,bool)" (?clear@ios_base@std@@QAEXH_N@Z) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(ios.obj) : error LNK2005: "public: virtual __thiscall std::ios_base::~ios_base(void)" (1ios_base@std@@UAE@XZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(ios.obj) : error LNK2005: "protected: void __thiscall std::ios_base::_Addstd(void)" (?_Addstd@ios_base@std@@IAEXXZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(ios.obj) : error LNK2005: "protected: void __thiscall std::ios_base::_Init(void)" (?_Init@ios_base@std@@IAEXXZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale0.obj) : error LNK2005: "public: class std::locale::facet const * __thiscall std::locale::_Getfacet(unsigned int,bool)const " (?_Getfacet@locale@std@@QBEPBVfacet@12@I_N@Z) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale0.obj) : error LNK2005: "public: bool __thiscall std::locale::_Iscloc(void)const " (?_Iscloc@locale@std@@QBE_NXZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale.obj) : error LNK2005: "public: class std::locale & __thiscall std::locale::_Addfac(class std::locale::facet *,unsigned int,unsigned int)" (?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale.obj) : error LNK2005: "public: __thiscall std::_Locinfo::_Locinfo(char const *)" (0_Locinfo@std@@QAE@PBD@Z) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
 libcpd.lib(locale.obj) : error LNK2005: "public: __thiscall std::_Locinfo::~_Locinfo(void)" (1_Locinfo@std@@QAE@XZ) bereits in msvcprtd.lib(MSVCP60D.dll) definiert
       libcpd.lib(xwctomb.obj) : error LNK2005: __Getcvt bereits in msvcprtd.lib(MSVCP60D.dll) definiert
       LIBCD.lib(dbgheap.obj) : error LNK2005: _free bereits in msvcrtd.lib(MSVCRTD.dll) definiert
       LIBCD.lib(crt0dat.obj) : error LNK2005: _exit bereits in msvcrtd.lib(MSVCRTD.dll) definiert
       LIBCD.lib(crt0dat.obj) : error LNK2005: __exit bereits in msvcrtd.lib(MSVCRTD.dll) definiert
       LIBCD.lib(strcat.obj) : error LNK2005: _strcpy bereits in msvcrtd.lib(MSVCRTD.dll) definiert
       LIBCD.lib(crt0init.obj) : error LNK2005: ___xc_z bereits in msvcrtd.lib(cinitexe.obj) definiert
       LIBCD.lib(crt0init.obj) : error LNK2005: ___xc_a bereits in msvcrtd.lib(cinitexe.obj) definiert
       LIBCD.lib(crt0init.obj) : error LNK2005: ___xi_z bereits in msvcrtd.lib(cinitexe.obj) definiert
       LIBCD.lib(crt0init.obj) : error LNK2005: ___xi_a bereits in msvcrtd.lib(cinitexe.obj) definiert
       LIBCD.lib(winxfltr.obj) : error LNK2005: __XcptFilter bereits in msvcrtd.lib(MSVCRTD.dll) definiert
       LIBCD.lib(crt0.obj) : error LNK2005: _mainCRTStartup bereits in msvcrtd.lib(crtexe.obj) definiert
       LIBCD.lib(fflush.obj) : error LNK2005: _fflush bereits in msvcrtd.lib(MSVCRTD.dll) definiert
 LINK : warning LNK4098: Standardbibliothek "msvcrtd.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
 LINK : warning LNK4098: Standardbibliothek "LIBCD" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
Wenn ich gemäß der Warnungen die beiden Bibliotheken rausnehme, wird's noch wilder, da die msvcrtd.lib ja benötigt wird. Jetzt habe ich die libcd.lib und die libcpd.lib rausgenommen und bekomme beim Linken folgende Fehlermeldungen:
Code:
MakeFileParser.lib(MFParser.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "__int64 const std::_Fpz" (?_Fpz@std@@3_JB)
 MakeFileParser.lib(MFParser.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "private: static class std::locale::_Locimp * std::locale::_Locimp::_Global" (?_Global@_Locimp@locale@std@@0PAV123@A)
 MakeFileParser.lib(MFParser.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class std::locale::id std::ctype<char>::id" (?id@?$ctype@D@std@@2V0locale@2@A)
 MakeFileParser.lib(MFParser.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)
 MakeFileParser.lib(MFParser.obj) : error LNK2001: Nichtaufgeloestes externes Symbol "private: static short const * const std::ctype<char>::_Cltab" (?_Cltab@?$ctype@D@std@@0PBFB)
Das sieht zwar schon wesentlich besser aus, aberirgendwie kann ich damit nichts anfangen. Ich kenne diese Symbole nicht, kenes davon verwende ich explizit.
Für mich sieht das ziemlich danach aus, als könnte ich eine Bibliothek, die STL-Elemente verwendet nicht in einer Applikation verwenden, die MFC verwendet. Aber eigentlich kanns das ja nicht sein.
Es würde mit echt sehr helfen, wenn jemand eine Lösung dafür wüsste, wie ich meine Lib in meiner Applikation verwenden kann.
 
Weiß da denn keiner eine Lösung? Ich habe mir schon die Finger wundgesucht, aber keine Hinweise auf Inkompatibilität gefunden. Das deutet für mich darauf hin, daß bei der LIB oder der Applikation möglicherweise irgendeine Einstellung falsch ist.
Gibt es evtl. eine Möglichkeit, die in meine LIB benötigten Sachen direkt zu meiner LIB zu linken, damit keine zusätzlichen Bibliotheken notwendig sind?
 
Wahrscheinlich haste das alles schon ausprobiert, aber ich schreibs trotzdem mal:

Hast du schon mal versucht die LIBC / LIBCD in deiner Bibliothek wegzulassen?

Oder auch ne idee wäre das du evtl. statt einer statischen Bibliothek eine DLL machst?

Oder das du MFC zu deiner statischen Bibliothek hinzufügst.

Viel Glück!
 
Hast du schon mal versucht die LIBC / LIBCD in deiner Bibliothek wegzulassen?
In eine Bibliothek wird ja keine andere Bibliothek eingebunden. (das war ja die Frage in meinem 2. Post, ob das irgendwie geht, die in meiner LIB verwendeten Objekte aus der libcd.lib in meine LIB zu übertragen. Ich wüßte da nämlich nichts.) Eine Bibliothek ist nur eine Sammlung von Objects, die Bibliotheken kommen erst beim Linken eines ausführbaren Programms zusammen. Da ich MFC-Objekte in der Applikation verwende, wird die msvcrtd.lib dazugelinkt. dann verwende ich Objekte aus meiner Bibliothek, also linke ich auch diese dazu. Darin aber werden wiederum Objekte aus der STL verwendet, also wird die libc.lib/libcd.lib dazugelinkt. Das passiert alles, wie gesagt, erst beim Linken der Applikation.
Wenn ich eine der beiden Bibliotheken (msvcrtd.lib oder libcd.lib) weglasse, fehlen mir jeweils einige Objekte, wenn ich beide drin habe, dann sind einige Objekte doppelt vorhanden. Es würde mir schon helfen, wenn ich dem Linker sagen könnte, daß er doppelte Objekte ignorieren soll und das erste nehmen soll das er findet. Bei anderen Compilern geht das nämlich. Die geben dann eine Warnung aus und das war's.
Trotzdem Danke für die Antwort, da fühle ich mich wenigstens moralisch unterstützt ;-)
 
Ich bekomme ähnliches mit eigenen Bibliotheken, wenn dort folgende Einstellung net übereinstimmt:

C/C++\Codererstellung\Laufzeitbibliothek unter den Projekt-Eigenschaften.

Würde auf jeden Fall mal schauen, ob da gleiches verwendet wurde, falls möglich.

Gabriel
 
SUPER! GENIAL! Das war's!
Danke, da wäre ich nie drauf gekommen. Jetzt linkt es ohne Probleme.
 
hi, jokey,

Ich treffte gleich Problem. Aber Ich kann nicht nach der Anweisung, die erwähnt wird, diese Problem auflösen. kannst du mir nochmal erzählen, wie du erfolgreich machst?

Vielen Dank
 
Zurück