Mehrfachdeklarationen im Linker
-
Danke!
dot schrieb:
Teile (libs, Object Files) deines Programmes linken offenbar die statische und andere Teile die dynamische Runtime. Lösung: Rausfinden welche das sind und sich entsprechend für eine Runtime entscheiden...
Wie finde ich raus, welche Teile das sind?!?
(Bin morgen früh wieder an der Maschine) Gute Nacht!
-
Hast Du garantiert als erste Headerdatei im stdafx.h die afx.h bzw. afxwin.h drin?
Das kann schon zu Problemen führen.
-
stimmt - aber eine Änderung der Reihenfolge hat auch nichts gebracht... ich habe auch angefangen die Projekteigenschaften zu vergleichen, aber bis jetzt nichts...
-
Verwende die Linker Eingenschaft /VERBOSE um dem auf die Schlichezu kommen.
Kann es sein, dass ein Modul mit einer anderen COmpiler Einstellung kompiliert wurde?
-
folgendes habe ich gefunden:
In "libcmt.lib(typinfo.obj)" referenziert 1> "MSVCRT.lib(ti_inst.obj)" geladen MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)"
Scheinbar findet er jeweils in den beiden Biliotheken "libcmt.lib" und "MSVCRT.lib" dieses type_info...
-
Natürlich. Wie gesagt sind das ja eben die beiden Varianten der Runtime. Du solltest aber eben nur eine davon linken. Irgendein Object File oder eine lib linked also eine andere Runtime wie der Rest deines Programms. Ich vermute eben mal dass du eine lib hast die gegen die statische Runtime gelinked wurde und deine exe die dynamische linked oder umgekehrt. Das funktioniert natürlich nicht.
-
wo kann ich denn einstellen was er benutzen soll?
-
Projekteigenschaften > C/C++ > Code Generation > Runtime Library. Für Debug Builds eben die Debug Versionen verwenden, für Release die ohne Debug. Wenn du keinen besonderen Grund hast was andres zu verwenden solltest du die dynamische Runtime (DLL Version) nehmen.
-
ich habe die verschiedenen, selbsgeschriebenen libs immer asl statische lib erzeugt - hat das etwas damit zu tun?
-
Meinst du gegen die statische Runtime gelinked? Wenn ja, dann ja natürlich^^
-
nein - wenn man das Projrkt neu anlegt, kann man den Anwendunstyp einstellen und den habe ich auf statische Library eingestellt - das meinte ich...
-
Lies mal:
http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspxAlso dnan nochmal zum Mitschreiben:
Der Linker sagt, dass er sowohl libcmt.lib als auch MSVCRT.lib gelinkt hast.Das heißt Du hast Kuddelmuddel in Deinen Projketeinstellungen, genaus so wie dot geschrieben hat!
-
Martin Richter schrieb:
Lies mal:
http://msdn.microsoft.com/en-us/library/abx4dbyh(VS.80).aspxVielen Dank für den nützlichen Hinweis!
Martin Richter schrieb:
Also dnan nochmal zum Mitschreiben:
Der Linker sagt, dass er sowohl libcmt.lib als auch MSVCRT.lib gelinkt hast.Das heißt Du hast Kuddelmuddel in Deinen Projketeinstellungen, genaus so wie dot geschrieben hat!
Es gab da tatsächlich ein gewisses Durcheinander, aber die Einstellung der lib gegen die man linkt ist nicht alles. Ich habe auch ein Projekt, das gegen die dll-Veersion der lib linkt, während die selbstgeschriebenen, mitgelinkten libs alle statisch gelinkt sind und das funktioniert!! Da handelt es sich allerdings durchweg um Win32-Projekte ohne MFC.
Mir scheint inzwischen, dass der wesentliche Unterschied bei der Erstellung des Projekts für die eigenen libs zu suchen ist. Wenn man den Haken bei MFC macht, dann scheint es zu laufen. Allerdings darf - wenn das Hauptprojekt ein MFC-Projekt ist - hier dann keinesfalls statisch mit dynamisch gemixed werden!
Was das der Haken bei MFC allerdings genau bewirkt und wie er sich im Sourcecode des Projekts manifestiert weiß ich leider auch noch nicht.