LIBCMT LICMTD Linker Error - Nur im Debug mode
-
Hallo!
Bekommen beim linken im Debug mode folgende Errors:
LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invoke_watson@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" (?_invalid_parameter@@YAXPBG00II@Z) already defined in LIBCMTD.lib(invarg.obj) LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in LIBCMTD.lib(invarg.obj)
Kann mir jemand sagen warum das kommt. Das ganze kommt nämlich nur wenn ich die Flags im Makefile auf Debug umschalte! Im Release Mode kommen die Fehler nicht.
Beide Libs sind direkt vom VC++ Compiler, d.h. in dessen lib Ordner zu finden. Aus irgendeinem Grund (wahrscheinlich mein Fehler) benutzt er einmal die Lib und dann mal die andere Lib und daher kommt wahrscheinlich der Fehler (ist nur meine Idee dazu). Weiß jemand was ich dagegen machen kann??
MFG THE_ONE
Ps(hier noch das make File):
# Compiler switches (see MSDN for more info) # /EHsc: synchronous exception handling, assume extern "C" funcs don't throw exceptions # /GR: enable RTTI # /FD: generate file dependencies # /Zm200: internal compiler memory allocation 200% (needed by some omnetpp lib sources) # /Od: disable optimizations (for debug code) # /O2: optimize for speed # /RTCs: stack frame runtime checking # /Zi: build program database (PDB file) which contains debug info # /DNDEBUG: #defines NDEBUG (removes assert() from generated code) # Linker switches: # /debug: build debug executable # /subsystem:console: build console-mode application (also works for GUI apps) # /opt:noref: keep functions and/or data that is never referenced (DOES NOT WORK!) # see http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=144087&SiteID=1&mode=1 # #CFLAGS_DEBUG=/EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE CFLAGS_DEBUG=/EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE /DSIMOMNET LDFLAGS_DEBUG=/subsystem:console /VERBOSE /debug #/opt:noref CFLAGS_RELEASE=/EHsc /GR /FD /Zm250 /O2 /DNDEBUG /D_CRT_SECURE_NO_DEPRECATE LDFLAGS_RELEASE=/subsystem:console /opt:noref CFLAGS=$(CFLAGS_DEBUG) LDFLAGS=$(LDFLAGS_DEBUG) #CFLAGS=$(CFLAGS_RELEASE) #LDFLAGS=$(LDFLAGS_RELEASE) # LIB_SUFFIX is either .lib or .dll LIB_SUFFIX=.lib # Patch begin # default /ML will use LIBC.lib !if "$(LIB_SUFFIX)"==".dll" CFLAGS_DEBUG=$(CFLAGS_DEBUG) /MDd CFLAGS_RELEASE=$(CFLAGS_RELEASE) /MD !else CFLAGS_DEBUG=$(CFLAGS_DEBUG) /MTd CFLAGS_RELEASE=$(CFLAGS_RELEASE) /MT !endif # Patch end
und hier noch ein Link auf die Microsoft Seite wo die Flags beschrieben sind. Werde leider selber nicht schlau daraus
. Vielleicht stehe ich auch nur auf dem Schlauch.
-
VC++ Hilfe:
Linkertoolfehler LNK2005Aktualisiert: November 2007
Fehlermeldung
<Symbol> ist bereits in <Objekt> definiert
symbol already defined in objectDas angegebene Symbol, das in seiner ergänzten Form dargestellt wird, wurde mehrfach definiert.
Weitere Informationen finden Sie in den folgenden Knowledge Base-Artikeln:
"LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries" (Q148652)
"Global Overloaded Delete Operator Causes LNK2005" (Q140440)
"LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT" (Q184235)
Knowledge Base-Artikel finden Sie auf der MSDN Library-CD-ROM oder unter http://support.microsoft.com/support.
Auf diesen Fehler folgt der schwerwiegende Fehler LNK1169.
Dieser Fehler kann eine der folgenden Ursachen haben:
Die Kombination statischer und dynamischer Bibliotheken bei gleichzeitiger Verwendung von /clr.Das Symbol ist eine Paketfunktion (wird durch die Kompilierung mit /Gy erstellt) und befindet sich in mehr als einer Datei, es wurde jedoch zwischen den Kompilierungen geändert. Kompilieren Sie alle Dateien neu, die Symbol enthalten.
Das Symbol wurde in zwei Memberobjekten in verschiedenen Bibliotheken unterschiedlich definiert, und beide Memberobjekte wurden verwendet.
Ein absolutes Symbol wurde zweimal definiert, in jeder Definition mit einem anderen Wert.
In einer Headerdatei wurde eine Variable deklariert und definiert. Folgende Lösungen sind möglich:
Deklarieren Sie die Variable in der H-Datei: extern BOOL MyBool; nehmen Sie dann Zuweisungen in einer C- oder CPP-Datei vor: BOOL MyBool = FALSE;.
Deklarieren Sie die Variable als static.
Deklarieren Sie die Variable als selectany.
Bei Verwendung von uuid.lib in Kombination mit anderen LIB-Dateien, durch die GUIDs definiert werden (z. B. oledb.lib und adsiid.lib). Beispiel:
Code kopieren
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
already defined in uuid.lib(go7.obj)Um das Problem zu beheben, fügen Sie den Befehlszeilenoptionen des Linkers /FORCE:MULTIPLE hinzu und stellen sicher, dass uuid.lib die erste Bibliothek ist, auf die verwiesen wird.
-
Naja, du solltest auch dem Compiler sagen dass er die Debug-Version der Runtime-Library nehmen soll:
CFLAGS_DEBUG=[b]/MTd[/b] /EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE /DSIMOMNET LDFLAGS_DEBUG=/subsystem:console /VERBOSE /debug CFLAGS_RELEASE=[b]/MT[/b] /EHsc /GR /FD /Zm250 /O2 /DNDEBUG /D_CRT_SECURE_NO_DEPRECATE LDFLAGS_RELEASE=/subsystem:console /opt:noref
Der Compiler schreibt nämlich einen Verweis in die .obj Files, dass der Linker die Runtime-Library XYZ linken soll. Wenn du dem Compiler also nicht über /MTd sagst dass er die Debug-Version verwenden soll, dann steht da ein Verweis auf die Release-Version (default) drinnen. Dem Linker sagst du dann dass du Debug haben willst. Der Linker linkt also wie von dir gewünscht die Debug-Library, PLUS wie vom Compiler gewünscht die Release-Library. Das Ergebnis ist der Fehler den du bekommst.
Davon abgesehen: wieso verwendest du make-files und nicht einfach Visual-Studio Project Files? Musst/willst du mit dem SDK-Compiler bauen?
p.S.: ist es Absicht dass "SIMOMNET" im Release nicht definiert ist?
@44203215: Wo bitte soll das jetzt hilfreich sein???
-
hustbaer schrieb:
Naja, du solltest auch dem Compiler sagen dass er die Debug-Version der Runtime-Library nehmen soll:
CFLAGS_DEBUG=[b]/MTd[/b] /EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE /DSIMOMNET LDFLAGS_DEBUG=/subsystem:console /VERBOSE /debug CFLAGS_RELEASE=[b]/MT[/b] /EHsc /GR /FD /Zm250 /O2 /DNDEBUG /D_CRT_SECURE_NO_DEPRECATE LDFLAGS_RELEASE=/subsystem:console /opt:noref
Hallo, und besten Dank für deine Hilfe!
Das was du mir da aufgeschrieben hast ist im Makefile schon drinnen. Schau nochmal ins Makefile (siehe erster Post ganz unten) in Zeile 39 und 40.
hustbaer schrieb:
Davon abgesehen: wieso verwendest du make-files und nicht einfach Visual-Studio Project Files? Musst/willst du mit dem SDK-Compiler bauen?
Nein sicher nicht beabsichtigt, nur ich weiß leider nicht ob es anders überhaupt geht.
Mein Szenario (damit ihr wisst um was es überhaupt geht):
Ich verwende OMNet++ (diskreter opensource event simulator) und das dazugehörige INET Framework (beinhaltet Module für den IP Stack und noch vieles mehr). Mit dem ganzen kann man herrlich Netzwerke simulieren. Meine Aufgabe ist es nun neue Module zu schreiben die es noch nicht gibt ich aber für meine Simulation benötige.
Geschrieben habe ich es nun, nur hänge ich oft und da wäre ein debugger von Vorteil. Daher habe ich mir gedacht schaust mal nach wie das geht. Und siehe da, man muss nur etwas die Makefiles ändern. Die Makefiles sind schon bei diesem Framework dabei (bzw können immer wieder neu generiert werden), und ich glaube ehrlich gesagt nicht das man ohne diese compilieren kann. Aber ich lasse mich gerne eines besseren belehren, da ich vom VisualStudio eigentlich 0 Ahnung habe (für das VisualStudio alleine würde man wahrscheinlich Jahre benötigen um sich damit wirklich auszukennen).hustbaer schrieb:
p.S.: ist es Absicht dass "SIMOMNET" im Release nicht definiert ist?
Keine Ahnung, wie gesagt - fertiges Makefile.
Das einzige was mir im Nachhinein eingefallen ist, ist dass ich ja das ganze Framework neu compiliere. Dabei werden aber glaube ich auch Sachen vom reinen OMNET++ (also der Simulator ohne Framework) gelinkt und die habe ich noch nie compiliert, bin mir damit aber nicht sicher.
Danke und Lg THE_ONE
-
Oops, da hab' ich wohl gepennt!
Aber...
versuch mal die Version:# Compiler switches (see MSDN for more info) # /EHsc: synchronous exception handling, assume extern "C" funcs don't throw exceptions # /GR: enable RTTI # /FD: generate file dependencies # /Zm200: internal compiler memory allocation 200% (needed by some omnetpp lib sources) # /Od: disable optimizations (for debug code) # /O2: optimize for speed # /RTCs: stack frame runtime checking # /Zi: build program database (PDB file) which contains debug info # /DNDEBUG: #defines NDEBUG (removes assert() from generated code) # Linker switches: # /debug: build debug executable # /subsystem:console: build console-mode application (also works for GUI apps) # /opt:noref: keep functions and/or data that is never referenced (DOES NOT WORK!) # see http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=144087&SiteID=1&mode=1 # #CFLAGS_DEBUG=/EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE CFLAGS_DEBUG=/EHsc /GR /FD /Zm250 /Od /RTCs /Zi /D_CRT_SECURE_NO_DEPRECATE /DSIMOMNET LDFLAGS_DEBUG=/subsystem:console /VERBOSE /debug #/opt:noref CFLAGS_RELEASE=/EHsc /GR /FD /Zm250 /O2 /DNDEBUG /D_CRT_SECURE_NO_DEPRECATE LDFLAGS_RELEASE=/subsystem:console /opt:noref ################# ################# ... erst /MTd dazumachen ... ################# # Patch begin # default /ML will use LIBC.lib !if "$(LIB_SUFFIX)"==".dll" CFLAGS_DEBUG=$(CFLAGS_DEBUG) /MDd CFLAGS_RELEASE=$(CFLAGS_RELEASE) /MD !else CFLAGS_DEBUG=$(CFLAGS_DEBUG) /MTd CFLAGS_RELEASE=$(CFLAGS_RELEASE) /MT !endif # Patch end ################# ################# ... DANN erst CFLAGS_DEBUG nach CFLAGS kopieren :-) ################# CFLAGS=$(CFLAGS_DEBUG) LDFLAGS=$(LDFLAGS_DEBUG) #CFLAGS=$(CFLAGS_RELEASE) #LDFLAGS=$(LDFLAGS_RELEASE) # LIB_SUFFIX is either .lib or .dll LIB_SUFFIX=.lib
Ich hab aber von Makefiles nicht wirklich Ahnung muss ich sagen. Ich vermute aber dass die "ganz normal von oben nach unten" ausgewertet werden, und dann muss das dazubasteln des /MTd Switches natürlich VOR dem Kopieren der Variable erfolgen, sonst wird's ja nicht mitkopiert.
-
Mann, Danke für den Tipp! Das habe ich ja voll übersehen! Das gibts es ja nicht! Werde das heute auf jedenfall mal ausprobieren und dann berichten.
Danke mal für alles! Lg THE_ONE