Problem mit Laufzeitbibliothek MDd /MTd



  • Hallo
    Ich habe ein ganz normales Programm geschrieben mit der Standard Einstellung für die Laufzeitbibliothek MDd.
    Nun muss ich das Programm aber mit einer Steuerung kombinieren. Die Steuerung wird auch in C++ programmiert, allerdings in einem Projekt mit der Einstellung MTd.
    Als ich jetzt versucht habe mein Projekt auch auf MTd umzustellen bekam ich folgende Fehlermeldung:

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

    Ich hab leider überhaupt keine Ahnung was MDd und MTd genau bedeuten und machen und wieso das nicht funktioniert und wäre euch deshalb sehr für Hilfe dankbar.
    Kann ich mein Projekt irgendwie auch unter MTd zum Laufen bringen?

    Und was mir noch aufgefallen ist als ich etwas mit der Steuerung und dem MTd Projekt gespielt habe: Als nur MT eingestellt war konnte ich header wie <iostream> nicht einbinden weil sich die Bibliothek der Steuerung nicht mit einer anderen Bib. vertragen hat (genau Fehlermeldung weiss ich leider nicht mehr) Nach Umstellung auf MTd ging es allerdings...wieso?

    Vielen Dank für eure Hilfe.



  • Fragt mich nicht warum aber auf einmal kommt die Fehlermeldung nicht mehr, dafür aber ein Haufen anderer 😉

    Fehler	1	error LNK2005: __invalid_parameter ist bereits in LIBCMTD.lib(invarg.obj) definiert.	MSVCRTD.lib	test1
    Fehler	2	error LNK2005: __CrtDbgReportW ist bereits in LIBCMTD.lib(dbgrptw.obj) definiert.	MSVCRTD.lib	test1
    Fehler	3	error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) ist bereits in LIBCMTD.lib(stdexcpt.obj) definiert.	MSVCRTD.lib	test1
    Fehler	4	error LNK2005: "public: __thiscall std::exception::exception(void)" (??0exception@std@@QAE@XZ) ist bereits in LIBCMTD.lib(stdexcpt.obj) definiert.	MSVCRTD.lib	test1
    Fehler	5	error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) ist bereits in LIBCMTD.lib(stdexcpt.obj) definiert.	MSVCRTD.lib	test1
    Fehler	6	error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) ist bereits in LIBCMTD.lib(stdexcpt.obj) definiert.	MSVCRTD.lib	test1
    Fehler	7	error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.	MSVCRTD.lib	test1
    Fehler	8	error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.	MSVCRTD.lib	test1
    Warnung	9	warning LNK4098: Standardbibliothek "MSVCRTD" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.	test1	test1
    Fehler	10	fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.	C:\Users\Daniel\Documents\Visual Studio 2008\Projects\test1\Debug\test1.exe	test1
    

  • Administrator

    1. Das hat nichts mit C++ zu tun, sondern ist ein Kompilerspezifisches Problem.
    2. Unterschied von MT(d) und MD(d): http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
    3. Ein DLL mit MT(d) zu kompilieren, sollte man eher vermeiden.
    4. Dein Programm linkt gegen MDd, während die Bibliothek, welche du verwenden willst, anscheinend gegen MTd gelinkt ist, weshalb es zu diesen doppelten Definitionen kommt.

    Grüssli



  • Danke erstmal 🙂
    Also ich benutze Visual Studio (hier 2008 , bei der Steuerung 2005).
    Folgende Fragen hab ich dazu noch:
    Wieso genau kann ich die Header wie zB. <iostream> bei MTd verwenden und bei MT nicht?
    Ich hab leider wirklich kein Plan: Welche DLL verwende ich denn wenn ganz normal mit VS2008 ne konsolen anwendung programmiere?

    4. Dein Programm linkt gegen MDd, während die Bibliothek, welche du verwenden willst, anscheinend gegen MTd gelinkt ist, weshalb es zu diesen doppelten Definitionen kommt.

    Mit Bibliothek die ich verwenden will meinst du, dass ich im Projekt die Laufzeitbibliotehk auf MTd eingestellt habe?
    Wieso linkt mein Programm denn gegen MDd wenn ich das umgestellt habe?

    Gibt es keine Möglichkeit den Code von meinem Projekt (MDd) dann 1zu1 auch in einem neu angelegten Projekt mit MT oder zur Not MTd zu nutzen?

    Gruß Zaus


  • Administrator

    Zaus schrieb:

    Also ich benutze Visual Studio (hier 2008 , bei der Steuerung 2005).

    Hmmm, ob das auch noch eine Fehlerquelle sein könnte? Da müsste man mal jemanden Fragen, der dies genauer weiss, vielleicht einen der MVPs hier. Normalerweise kann man Bibliothek nicht einfach so zwischen unterschiedlichen Kompilern verwenden. Dies gilt auch für gleicher Hersteller andere Version. Zum Teil gehts, zum Teil aber eben auch nicht.

    Zaus schrieb:

    Wieso genau kann ich die Header wie zB. <iostream> bei MTd verwenden und bei MT nicht?

    Das macht keinen Sinn. Das wird irgendein anderes Problem gewesen sein, welches du völlig falsch interpretiert hast.

    Zaus schrieb:

    Ich hab leider wirklich kein Plan: Welche DLL verwende ich denn wenn ganz normal mit VS2008 ne konsolen anwendung programmiere?

    Bei einem ganz frischen Projekt ist normalerweise MD für die Release und MDd für die Debug Version eingestellt.

    Zaus schrieb:

    4. Dein Programm linkt gegen MDd, während die Bibliothek, welche du verwenden willst, anscheinend gegen MTd gelinkt ist, weshalb es zu diesen doppelten Definitionen kommt.

    Mit Bibliothek die ich verwenden will meinst du, dass ich im Projekt die Laufzeitbibliotehk auf MTd eingestellt habe?

    Nein, mit Bibliothek meine ich die Steuerungsbibliothek, welche du verwenden willst. Deine Laufzeitbibliothek (bzw. CRT) ist auf MDd eingestellt. Damit es funktioniert, müsste sie aber auf MTd eingestellt sein, da die Steuerungsbibliothek gegen MTd linkt. Man muss immer in den verwendeten Bibliotheken und im Programm selbst gegen die gleiche CRT linken.

    Zaus schrieb:

    Wieso linkt mein Programm denn gegen MDd wenn ich das umgestellt habe?

    Hast du es für Debug und Release umgestellt? Die haben nämlich jeweils eigene Einstellungen.

    Zaus schrieb:

    Gibt es keine Möglichkeit den Code von meinem Projekt (MDd) dann 1zu1 auch in einem neu angelegten Projekt mit MT oder zur Not MTd zu nutzen?

    Dazu braucht es nicht ein neues Projekt, sondern nur die richtigen Einstellungen auf allen Seiten 🙂

    Grüssli


  • Administrator

    Im übrigen noch zu diesem Problem, habe gerade meine Nachforschung dazu beendet:

    Zaus schrieb:

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

    Gibt zwei Möglichkeiten dies zu beheben:
    1. Clean & Rebuild
    2. Die Anti-Virus Software davon überzeugen, dass mt.exe nicht böse ist, und/oder das Debug und Release Verzeichnis deines Projektes von der Überwachung ausschliessen lassen.

    Grüssli



  • Vielen Dank für deine Mühe!

    Ich glaub ich muss dazu noch ein paar Sachen anmerken.
    Also der Rechner wo ich die Steuerung programmiere steht nicht hier. Ich hab am Freitag etwas an der Steuerung programmiert und sitze jetzt zu Hause an meinem Rechner (mit VS2008) und versuche mein Projekt schonmal so umzustellen, dass es dann mit den gegebenen Einstellungen bei der Steuerung (MT(d)) auch läuft.
    Es gibt also bis jetzt kein Problem mit der Kompatibiltät VS2005-VS2008 weil ich es noch gar nicht versucht habe 😉

    Zu den Unterschieden MT/MTd: Ich erstelle ein neuen Projekt , anschließend stelle ich unter Konfigurationseingnschaften->C/c++>Codegenerierung Debug und Release auf MT... keine Fehler beim kompilieren. Jetzt includiere ich <iostream>

    Warnung	1	warning LNK4098: Standardbibliothek "LIBCMT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.	test7	test7
    Fehler	2	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__malloc_dbg" in Funktion ""void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)".	libcpmtd.lib	test7
    Fehler	3	error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__free_dbg" in Funktion ""void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z)".	libcpmtd.lib	test7
    Fehler	4	fatal error LNK1120: 2 nicht aufgelöste externe Verweise.	C:\Users\Daniel\Documents\Visual Studio 2008\Projects\test7\Debug\test7.exe	test7
    

    Wenn ich aber am Anfang bei Debug auf MTd umstelle kommen diese Fehlermeldungen alle nicht...

    Nein, mit Bibliothek meine ich die Steuerungsbibliothek, welche du verwenden willst. Deine Laufzeitbibliothek (bzw. CRT) ist auf MDd eingestellt. Damit es funktioniert, müsste sie aber auf MTd eingestellt sein, da die Steuerungsbibliothek gegen MTd linkt. Man muss immer in den verwendeten Bibliotheken und im Programm selbst gegen die gleiche CRT linken.

    Bei der Steuerung binde ich mit pragma comment eine Bibliothek ein die aufgrund der gefordeten Einstellungen wohl statisch ist. Wenn ich aber ansonsten in meinem Programm keine Bibliothek mit pragma extra eingebunden haben, dann müsste mein Code doch genauso auch in dem Projekt der Steuerung funktionieren.

    Dazu braucht es nicht ein neues Projekt, sondern nur die richtigen Einstellungen auf allen Seiten 🙂

    Dann versteh ich aber nicht wieso ich so viele Fehlermeldungen bekomme wenn ich mein bestehendes Projekt von MDd auf MTd umstellen möchte (VS2008) Habe außer den Standard Headern nur TinyXML eingebunden (und selbst wenn ich das weglasse funktioniert es nicht)

    Gruß Zaus


  • Administrator

    Zaus schrieb:

    Wenn ich aber am Anfang bei Debug auf MTd umstelle kommen diese Fehlermeldungen alle nicht...

    MTd ist ja auch richtig für die Debug Version. Das d nach dem MT steht ja auch für Debug. MTd ist die statische CRT Bibliothek fürs Debuggen.

    Zaus schrieb:

    Bei der Steuerung binde ich mit pragma comment eine Bibliothek ein die aufgrund der gefordeten Einstellungen wohl statisch ist. Wenn ich aber ansonsten in meinem Programm keine Bibliothek mit pragma extra eingebunden haben, dann müsste mein Code doch genauso auch in dem Projekt der Steuerung funktionieren.

    Verstehe nur Bahnhof, was du hier sagen möchtest 🙂

    Zaus schrieb:

    Dann versteh ich aber nicht wieso ich so viele Fehlermeldungen bekomme wenn ich mein bestehendes Projekt von MDd auf MTd umstellen möchte (VS2008) Habe außer den Standard Headern nur TinyXML eingebunden (und selbst wenn ich das weglasse funktioniert es nicht)

    Moment, mit MDd hat es funktioniert? Oder wie jetzt?

    Huff, ich hatte eindeutig noch keinen Kaffee heute morgen 🙂

    Grüssli



  • Vielleicht red ich auch einfach nur Mist 🙂

    MTd ist ja auch richtig für die Debug Version. Das d nach dem MT steht ja auch für Debug. MTd ist die statische CRT Bibliothek fürs Debuggen.

    Ok das wusste ich nicht, damit ist dieses Problem gelöst 🙂

    Verstehe nur Bahnhof, was du hier sagen möchtest 🙂

    Binde ich mit #pragma comment (lib, "xyz.lib") denn keine Bibliothek ein? Also das Tutorial für die Steuerung gibt vor, dass das Projekt auf MT(d) umgestellt werden muss und diese Bibliothek xyz eingebunden werden muss. Das habe ich so interpretiert, als dass die Steuerungsbib. gegen MT(d) linkt. Wenn ich nun in meinem Projekt(welches ich hier zu Hause geschrieben habe) auch gegen MT(d) linke und KEINE weitere Bib eingebunden habe (die ja möglichweise wieder gegen MD(d) linken könnte) müsste das doch funktionieren.

    Moment, mit MDd hat es funktioniert? Oder wie jetzt?

    Also ich habe ein Projekt (nur hier zu Hause noch nicht zusammen mit der Steuerung). Dieses Projekt ist standardmäßig auf MD(d) eingestellt und es funktioniert auch alles. Jetzt möchte ich es auf MT(d) umstellen um es später mit der Steuerungsbib. verwenden zu können. Beim Umstellen auf MT(d) erhalte ich aber 41 Fehler vom Linker...

    Gruß Zaus


  • Administrator

    Zaus schrieb:

    Vielleicht red ich auch einfach nur Mist 🙂

    Oder ich habe irgendwo etwas falsch verstanden 😉

    Zaus schrieb:

    Binde ich mit #pragma comment (lib, "xyz.lib") denn keine Bibliothek ein? Also das Tutorial für die Steuerung gibt vor, dass das Projekt auf MT(d) umgestellt werden muss und diese Bibliothek xyz eingebunden werden muss. Das habe ich so interpretiert, als dass die Steuerungsbib. gegen MT(d) linkt. Wenn ich nun in meinem Projekt(welches ich hier zu Hause geschrieben habe) auch gegen MT(d) linke und KEINE weitere Bib eingebunden habe (die ja möglichweise wieder gegen MD(d) linken könnte) müsste das doch funktionieren.

    Ja, klingt eigentlich korrekt.

    Zaus schrieb:

    Also ich habe ein Projekt (nur hier zu Hause noch nicht zusammen mit der Steuerung). Dieses Projekt ist standardmäßig auf MD(d) eingestellt und es funktioniert auch alles. Jetzt möchte ich es auf MT(d) umstellen um es später mit der Steuerungsbib. verwenden zu können. Beim Umstellen auf MT(d) erhalte ich aber 41 Fehler vom Linker...

    Also moment, nur dass ich dich richtig verstehe:
    1. Du linkst noch nicht gegen die Steuerungsbibliothek.
    2. Du linkst gegen überhaupt keine Bibliothek.
    3. Wenn du auf MT(d) umstellst, dann bekommst du diese Linkerfehler? 😕

    Dann würde ich einfach nur ein Clean & Rebuild vorschlagen 🙂

    Grüssli



  • Das hast du alles richtig verstanden und es funktioniert!
    Wenn es am Montag dann Probleme beim zusammenführen mit der Steuerungsbibliothek gibt meld ich mich hier wieder 😉

    Vielen Dank für deine Hilfe und noch nen schönen Tag.
    Gruß Zaus



  • Also Fehlermeldungen bekomm ich keine allerdings Warnungen , bei denen ich nicht weiss wie sie zu beseitigen sind...

    LIBCMTD.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "libcmt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    libmlcwin32.lib(mlcApiLib.obj) : warning LNK4099: PDB "vc80.pdb" wurde nicht mit "D:....." oder an "\\....." gefunden; Objekt wird verknüpft, als ob keine Debuginformationen vorhanden wären.
    


  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Schade, dass der Beitrag verschoben wurde. Im anderen Forum wurde mir doch gleich geantwortet?!

    Kann mir vielleicht jemand sagen, wie ich in VS2005 /NODEFAULTLIB:libcmt.lib "einfüge". Hab gelesen , dass man das irgenwie mit dem Linker machen muss nur hab ich leider keine Ahnung wie das geht, VS macht das linken usw ja immer von selbst.


Log in to reply