Probleme mit VC++6 Projekt beim Kompilieren/Linken mit VC++ 2003.Net
-
Hallo ich habe das Problem, dass ich ein mit VC++ 6.0 erstelltes Projekt mit VC++2003.Net nicht bzw. nur teilweise kompilieren kann.
Das Projekt besteht aus einer .cpp Datei und mehreren .h files. Außerdem enthält es einen Ordner mit 3 Libs die ebenfalls notwendig sind. Ich vermute hier liegt das Problem.
Wenn ich nur die cpp Datei kompiliere klappt das einwandfrei. Beim Starten und beim Erstellen der Projektmappe erhalte ich allerdings 80 Buildfehler und 11 Warnungen.
Das sind unter anderem:
---
LINK : warning LNK4075: '/EDITANDCONTINUE' wird auf Grund der Angabe von '/INCREMENTAL:NO' ignoriert
.\Debug\TestPltfClient.obj : warning LNK4042: Objekt mehrmals angegeben; zusätzliche Objekte ignoriert
libcpd.lib(locale0.obj) : error LNK2005: "public: __thiscall std::locale::locale(void)" (??0locale@std@@QAE@XZ) bereits in PrjPlatformClientLib.lib(LogData.obj) definiert
---
PrjPlatformClientLib.lib(XercesFassade.obj) : error LNK2001: Nichtaufgelöstes externes Symbol "void __cdecl std::_Xlen(void)" (?_Xlen@std@@YAXXZ)
---
PrjPlatformClientLib.lib(NR_Matrix.obj) : error LNK2019: Nicht aufgelöstes externes Symbol '"void __cdecl std::_Xlen(void)" (?_Xlen@std@@YAXXZ)', verwiesen in Funktion '"public: virtual void * __thiscall NR_Matrix::`scalar deleting destructor'(unsigned int)" (??_GNR_Matrix@@UAEPAXI@Z)'
----Ich vermute Probleme mit den Versionen der Libs, aber eigentlich bin ich ein absolut ahnungsloser VC++ Beginner.
Folgende Linker Optionen werden verwendet:
---
/OUT:"./Bin/PrjPlatformClientExe.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"./lib" /NODEFAULTLIB:"libc" /DEBUG /PDB:".\./Bin/PrjPlatformClientExe.pdb" /SUBSYSTEM:CONSOLE /OPT:NOWIN98 /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
---
und zusätliche Optionen:
---
PrjPlatformClientLib.lib xerces-c_2.lib wsock32.lib .\Debug\TestPltfClient.obj "
---Hab das mal 1:1 kopiert.
Laut dem Entwickler des Projekts habe ich noch zur Umgebungsvariable 'PATH' den Pfad des 3 zusätzlichen Libs hinzugefügt. Das hat aber zu keiner Besserung geführt.Wenn ich die 3 Libs, bzw. die zusätlichen Optionen entferne reduzieren sich die Fehler auf immerhin 22 (+11 Warnings). Diese sind:
---
TestPltfClient.obj : error LNK2019: Nicht aufgelöstes externes Symbol '"public: virtual __thiscall ThrdPltfCtrlClient::~ThrdPltfCtrlClient(void)" (??1ThrdPltfCtrlClient@@UAE@XZ)', verwiesen in Funktion '_main'
---
TestPltfClient.obj : error LNK2001: Nichtaufgelöstes externes Symbol "class LogData GlLogSys1Instance" (?GlLogSys1Instance@@3VLogData@@A)
---Da ich schon Stunden investiert habe un nicht weiterkomme, versuche ich es mal auf diesem Weg. Ist mein erster Beitrag in einem Forum....
Weiß jemand Rat? Danke schon mal...
-
OK habe die Fehler reduziert. Es ist nur noch ein Fehler mit 5 Warnungen.
Habe lediglich folgende Zeile in die .cpp Datei eingefügt:
---
_check_commonlanguageruntime_version;
---Hier habe ichs gefunden:
----
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcerrLinkerToolsErrorLNK2019.asp
---Der Fehler Lautet nun:
---
TestPltfClient.cpp(19) : error C2501: '_check_commonlanguageruntime_version': Fehlende Speicherklasse oder Typspezifizierer
---Die Warnings sind:
---
VecLineSeg2D.h(26) : warning C4018: '<': Konflikt zwischen 'signed' und 'unsigned'
---???
-
Help!!
Hab das ganze Projekt nun mal mit VC++ 2005 erstellt. Nachdem ich die Linker option /FORCE:MULTIPLE on den Projekteigenschaften hinzugefügt habe, kam nur noch eine Fehlermeldung:
---
LINK : fatal error LNK1104: Datei "libcp.lib" kann nicht geöffnet werden.
---
Zusätzlich gab es noch ein Warnings die sich aber auf die zusätlich eingefügte Linkeroption beziehen:---
LIBCMTD.lib(stdexcpt.obj) : warning LNK4006: "public: virtual __thiscall std::bad_cast::~bad_cast(void)" (??1bad_cast@std@@UAE@XZ) ist bereits in "PrjPlatformClientLib.lib(ChkIni.obj)" definiert; zweite Definition wird ignoriert.
LINK : fatal error LNK1104: Datei "libcp.lib" kann nicht geöffnet werden.
---Ich kann das Programm immer noch nicht starten. Weis keiner Rat? Bleibt mir nur noch auf VC++6.0 abzusteigen???
Es geht um meine Studienarbeit! Please Help!!!
-
Du soltest es zuerst mal hinbekommen, dass Du das Force-Multiple nicht benötigst! Das verursacht IMHO nur Probleme (wenn nicht zu Compilezeit, dann zur Laufzeit).
Du musst darauf achten, dass *alle* LIBs, die Du einbindest die *gleichen* Einstellungen für die CRT/ATL haben!!! Also vermutlich "shared DLL"... Dann sollten sich die meisten Linker-Probleme auflösen.
Falls Du LIBs einbindest, die *nicht* mit VC2005 erstellt wurden, dürfen diese *keine* CRT/STL/MFC/ATL Dinger exportieren, da dies sonst nicht kompatibel ist!
Oder Du stellst sicher, dass alles mit VC2005 übersetzt wurde.
-
---
...Du musst darauf achten, dass *alle* LIBs, die Du einbindest die *gleichen* Einstellungen für die CRT/ATL haben!!! ...
---Wie stelle ich das fest welche einstellungen diese LIBs haben?
-
Wenn Du sie selber erstellst, kannst Du ja in den Projekteinstellungen nachschauen!
Mittels dumpbin sollte es auch möglich sein... Du kannst auch die Linker-Settings auf Verbose stellen, dann wird beim Linken viel mehr angezeigt...
-
habe mal auf VERBOSE gestellt. Im Buildlog steht zwar mehr drin, aber damit kann ich wenig anfangen. Studiere nur ET nicht Informatik. Keine Ahnung was ich damit anfangen soll.
Die LIBs hab ich nicht selbst erstellt sondern nur eingebunden. Das einzige was ich kompiliere ist eine .cpp Datei Diese wird dann mit den bereits fertigen LIBs und den MS-Standard(???) Libs gelinkt. Meine Vermutung ist, das die fertige "TestPrjPlatformCtrllib"lib, mit der VC++6.0 erstellt wurde und die Standardbibliothek iostream.h verwendet wurde. Da diese ab VC++ 2003 verändert/verschoben (??) wurde kommt es zur Fehlermeldung (Nr. 12, siehe unten).
...aber wie gesagt ich vermute nur. Ich denke ich werde morgen wieder mal das alte Visual Studio6.0 installiern und versuchen das ganze damit zu erstelle...
---
Fehler 8 error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) ist bereits in PrjPlatformClientLib.lib(ChkIni.obj) definiert. libcpmtd.lib
Fehler 9 error LNK2005: "public: __thiscall std::bad_cast::bad_cast(char const *)" (??0bad_cast@std@@QAE@PBD@Z) ist bereits in PrjPlatformClientLib.lib(ChkIni.obj) definiert. LIBCMTD.lib
Fehler 10 error LNK2005: "public: __thiscall std::bad_cast::bad_cast(class std::bad_cast const &)" (??0bad_cast@std@@QAE@ABV01@@Z) ist bereits in PrjPlatformClientLib.lib(ChkIni.obj) definiert. LIBCMTD.lib
Fehler 11 error LNK2005: "public: virtual __thiscall std::bad_cast::~bad_cast(void)" (??1bad_cast@std@@UAE@XZ) ist bereits in PrjPlatformClientLib.lib(ChkIni.obj) definiert. LIBCMTD.lib
Fehler 12 fatal error LNK1104: Datei "libcp.lib" kann nicht geöffnet werden. TestPrjPlatformCtrllib
---
-
Wenn Du STL Dinge verwendest musst Du für alle LIBs/EXEn die gleichen Compiler verwenden!
-
Ok. Wenn also in den Projekteinstellungen unter "Eingabe" bei "Standard Bibliothek ignorieren" "Nein" eingestellt ist und die bereits kompilierten LIBs mit einem anderen Compiler erstellt wurden, kann ich das Projekt nicht mit einer neueren Version von VC++ erstellen. Ich muss dann die selbe Version verwenden mit der die bereits kommpilierten LIBs erstellt wurden. Also VC++ 6.0. Gibts da auch unterschiedliche Versionen? Habe ich das so richtig verstanden?
Sorry. Ich bin a bisserl anstrengend, oder? Habe so gut wie keine Erfahrung mit VC++. Ist alles neu für mich. Habe bis jetzt immer mit GCC, UNIX und der Kommandozeile gearbeitet...
-
Es spielt keine Rolle, was Du im Projekt eingestellt hast. Das wichtigste ist: Wen eine LIB irgendwas von der STL/MFC/ATL verwendet und in den Funktions-Signaturen exportiert, dann müssen alle mit dem gleichen Compiler erstellt sein (Service Packs spielen AFAIK keine Rolle).
Wenn Du Fragen hast, darfst Du ruhig Fragen! Deswegen ist dieses Forum ja da!
-
Im Klartext bedeutet das: Um mit VC++ 03 das Projekt erstellen zu können benötige ich die Sourcecodes der zusäztlichen LIBs. Wenn ich die nicht bekomme muss ich den selben Compiler verwenden. Das heist VC++ 6.0 installieren....
-
Du hast es auf den Punkt getroffen!
-
VC6, gibts das noch wo anders als bei Ebay? Irgendwelche offiziellen Quellen?
-
Installiert, Kompiliert,
---
PrjPlatformClientExe.exe - 0 Fehler, 0 Warnung(en)
---Na endlich. Na ja, jetzt kenne ich die Projekteigenschaften von VC++6.0 - VC++2005 so gut wie auswendig und habe alle Versionen auf 3 Verschiedenen Rechnern installiert. Jetzt kann ich auch mit meiner Studienarbeit anfangen. Der Vorteil ist nun das ich meinem Prof. genau erklären kann warum ich mit 6.0 arbeiten muss.
Übrigens: Das Thema ist Testen der API eines mobilen Roboters.
Vielen Dank noch mal.
-
An meiner FH kann man sich von Visual Studio 6.0 Professional - Visual Studio 2005 Professional ganz legale kopien erstellen, in sofern man dort studiert.
http://www.fh-aschaffenburg.de/index.php?id=softwarelizenzen
Alles für Forschung und Lehre. Dafür ein dickes lob an Bill G.
.Diese Versionen müssen auch registriert werden. Ausser 6.0 anscheinend. Als ich da auf Registrieren gegangen bin kam ich bei msdn raus, aber diese Seite hat nicht mehr existiert.
-
Ich bin leider kein Student.
-
Aber beklagen kannst Du Dich auch nicht
VS6 ist leider nicht mehr beim MSDN dabei, da es abgekündigt ist und es (Lizenz-) Probleme mit Java gab... Aber schau doch mal ob es auf der VS2003 DVD drauf ist...