MSVC++ 7.1 - "msvcr71.dll" statisch linken
-
Hallo,
ich hab ein programm geschrieben und das brauch beim starten immer diese msvcr71.dll aus C:\Windows\system32
Da diese aber logischerweise nich jeder haben kann, der mein programm hat, habe ich mich entschlossen die msvcr71.dll mit einzubinden (bzw. versuche ich das ganze zeit). Dazu bin ich in Visual Studio in die Projekteinstellungen gegangen unter C/C++ > Code Generation > Runtime Library den wert von "Multi-threaded DLL (/MD)" auf "Multi-threaded (/MT)" gestellt. Beim kompilieren kamen erst diese fehler hier:MSVCRT.lib(MSVCR71.dll) : error LNK2005: _memmove already defined in LIBCMT.lib(memmove.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _strncmp already defined in LIBCMT.lib(strncmp.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isspace already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _strchr already defined in LIBCMT.lib(strchr.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _exit already defined in LIBCMT.lib(crt0dat.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _tolower already defined in LIBCMT.lib(tolower.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isxdigit already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _calloc already defined in LIBCMT.lib(calloc.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isdigit already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _strncpy already defined in LIBCMT.lib(strncpy.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _atoi already defined in LIBCMT.lib(atox.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isprint already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: __atoi64 already defined in LIBCMT.lib(atox.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isupper already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _isalpha already defined in LIBCMT.lib(_ctype.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _getenv already defined in LIBCMT.lib(getenv.obj)
MSVCRT.lib(MSVCR71.dll) : error LNK2005: _abort already defined in LIBCMT.lib(abort.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)fatal error LNK1169: one or more multiply defined symbols found
Nach langem MSDN suchen hab ich eine "lösung" gefunden. Undzwar mit der linker einstellung "/FORCE:MULTIPLE". Nun kompilierte sich das programm ganz normal und funktioniert auch super.
Allerdings ist es immer noch auf diese msvcr71.dll angewiesen aus dem system32-ordner. Das finde ich so heraus - ich bennene in C:\Windows\system32\ die datei msvcr71.dll kurz um in irgendwas sinnloses, dann versuch ich mein programm zu starten, aber es kommt eine fehlermeldung, dass die msvcr71.dll nicht gefunden werden konnte.
Ich dachte eigentlich mit dem /MT statt /MD ist das problem gelöst, ist aber nicht so.
Wie kann ich das so hinbiegen, dass mein programm nich auf extra externe dll's angewiesen ist, die standardweise windows eigentlich gar nicht mitliefert?danke für eure hilfe!
-
ich bitte um jeden kleinen vorschlag. hänge an dem problem schon seit einiger zeit
-
Hast du nach dr umstellung von DLL auf LIB das Projekt bereinigt und
komplett neu gebildet?
-
ja, habs eben sogar nochmal extra getestet. Das programm wird ja auch um ca. 60kb größer, aber trotzdem noch will er die dll haben. vielleicht hab ich die falsche option eingestellt? vielleicht ist es was anderes was ich einstellen muss um es statisch zu linken?
-
hm, verwendest du vielleicht noch andere bibliotheken die vielleicht die
dll version linken? kann man das projekt irgendwo vielleicht sehen?
auf der vc commando ebene hast du das tool dumpbin.exe, damit kannst du
sehen, welchen funktionen deine exe importiert und welche dll's dazu nötig
sind.
Aufruf: dumpbin meinprg.exe /IMPORTS
falls alles wegscrollt, kann man es besser in eine datei schreiben lassen:
dumpbin meinprg.exe /IMPORTS >> dump.txt
-
Du solltest nicht die DLL-Einstellungen ändern sondern die MFC statisch linken.
Such mal nach dieser Einstellung.