none
2. Problem beim Portieren von VS6 nach VS2010 RRS feed

  • Frage

  • Hallo zusammen,

    nachdem ich mit der Hilfe von Martin unsere Uralt Bibliothek kompilieren konnte, trat bei der wichtigsten Applikation wieder ein Problem auf :-(

    Ich erhalte folgende Linkerfehler:

    1>Core_D.lib(_StatisticBase.obj) : error LNK2019: unresolved external symbol
    "class std::basic_ostream<char,struct std::char_traits<char> > &
     __cdecl MC::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,
    class MC::TSet<enum MC::XtlStateFlag> const &)"
    (??6MC@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@ABV?$TSet@W4XtlStateFlag@MC@@@0@@Z)
    referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > &
    __cdecl MC::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,
    class MC::TCrystalState)" (??6MC@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@VTCrystalState@0@@Z)

    1>Core_D.lib(_StatisticBase.obj) : error LNK2019: unresolved external symbol
    "class std::basic_istream<char,struct std::char_traits<char> > &
    __cdecl MC::operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,
    class MC::TSet<enum MC::XtlStateFlag> &)"
    (??5MC@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV12@AAV?$TSet@W4XtlStateFlag@MC@@@0@@Z)
    referenced in function "class std::basic_istream<char,struct std::char_traits<char> > &
    __cdecl MC::operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,
    class MC::TCrystalState &)" (??5MC@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV12@AAVTCrystalState@0@@Z)

    Sieht so aus wie wenn meine stream operatoren aus dem TSet Template nicht erzeugt werden wenn die Klasse TCrystalState
    in die Lib (Core_D.lib / Core.lib) compiliert wird.

    Hier noch die abgespeckten Klassen deklarationen und definitionen:

    template<class T>
    
    class TSet
    
    {
    
    public:
    
    typedef std::vector<std::string> NameVect;
    
    
    
     TSet ();
    
     TSet (const TSet&);
    
     TSet (T);
    
     virtual ~TSet () { }
    
    
    
    
    
     friend Tostream& operator<< (Tostream&, const TSet&);
    
     friend Tistream& operator>> (Tistream&, TSet&);
    
    };
    
    
    
    //----- operator<< ------------------------------------------------------
    
    template<class T>
    
    Tostream& operator<< (Tostream& stream, const TSet<T>& set)
    
    {
    
     stream << set.mSetVal;
    
     return stream;
    
    }
    
    
    
    //----- operator>> -----------------------------------------------------
    
    template<class T>
    
    Tistream& operator>> (Tistream& stream, TSet<T>& set)
    
    {
    
     stream >> set.mSetVal;
    
     return stream;
    
    }
    
    
    
    ------------- StatisticBase.h ------------------
    
    
    
    typedef enum XtlStateFlag { eCsOkay, eCsEmpty, eCsNotMeasured, eCsShortened,
    
      eCsNoFS, eCsNoFL, eCsUnstableFS, eCsUnstableFL,
    
      eCsNoRS, eCsRSOverflow, eCsNoC1, eCsNoC0, eCsNoPower,
    
      eCsMinDF, eCsMaxDF, eCsMinRS, eCsMaxRS,
    
      eCsMinC1, eCsMaxC1, eCsMinC0, eCsMaxC0,
    
      eCsMinPower, eCsMaxPower, eCsMinQFactor,
    
      eCsMaxQFactor, eCsMinL1, eCsMaxL1, eCsNoClass,
    
      eCsCompDFMax, eCsCompDFMin, eCsCompRSMax,
    
      eCsCompRSMin
    
     };
    
    
    
    typedef TSet<XtlStateFlag> TXtlState;
    
    
    
    class TCrystalState
    
    {
    
    public:
    
     TCrystalState ();
    
     TCrystalState (const TCrystalState&);
    
     TCrystalState (const TXtlState&);
    
     TCrystalState (XtlStateFlag);
    
     ~TCrystalState () { }
    
    
    
    
    
     friend Tostream& operator<< (Tostream&, const TCrystalState);
    
     friend Tistream& operator>> (Tistream&, TCrystalState&);
    
    
    
    private:
    
     TXtlState mState; 
    
    };
    
    
    
    ------------- StatisticBase.cpp ------------------
    
    //----- Operator<< ------------------------------------------------------
    
    Tostream& operator<< (Tostream& stream, const TCrystalState state)
    
    {
    
     return stream << state.mState;
    
    }
    
    
    
    //----- Operator>> ------------------------------------------------------
    
    Tistream& operator>> (Tistream& stream, TCrystalState& state)
    
    {
    
     return stream >> state.mState;
    
    }
    
    
    
    

     Wenn ich die operatoren für TCrystalState wie unten schreibe, dann funktioniert es:

    //----- Operator<< ------------------------------------------------------
    Tostream& operator<< (Tostream& stream, const TCrystalState state)
    {
     return stream << state.mState.Value ();
    }
    
    //----- Operator>> ------------------------------------------------------
    Tistream& operator>> (Tistream& stream, TCrystalState& state)
    {
     unsigned val;
     stream >> val;
     state.mState.SetValue (val);
     return stream;
    }
    
    

    Ist aber alles andere als Elegant. Wenn hier auch so ein kleines Wörtchen an der richtigen Stelle helfen würde
    wäre das natürlich schön ;-)

    Herzliche Grüsse
    Walter

     

     

    • Bearbeitet Walter Eicher Freitag, 19. November 2010 15:18 Formatierung
    Freitag, 19. November 2010 15:16

Antworten

  • VC6 war wirklich toll -.- Der Knackpunkt sind die hier:

    friend Tostream& operator<< (Tostream&, const TSet&);
    friend Tistream& operator>> (Tistream&, TSet&);

    Diese Funktionen existieren nicht. Man ist vielleicht geneigt,

    template<class T> Tostream& operator<< (Tostream& stream, const TSet<T>& set);

    und

    template<class T> Tostream& operator>> (Tostream& stream, TSet<T>& set);

    so zu interpretieren – und VC6 mag das fälschlicherweise durchgehen gelassen haben – aber es sind komplett unterschiedliche Funktionen, da das, was du als Freunde vordeklariert hast, keine Templates sind, die definierten Operatoren hingegen schon. Darum musst du die Freunddeklarationen ändern:

    template<class T> friend Tostream& operator<< (Tostream&, const TSet<T>&);
    template<class T>friend Tistream& operator>> (Tistream&, TSet<T>&);

    Das alles ist mir zu viel Quelltext um alle Fehler zu suchen, aber es kann durchaus sein, dass du diesen Fehler an noch viel mehr Stellen korrigieren müssen wirst, damit alles kompiliert.

    Gruß

    • Als Antwort markiert Walter Eicher Montag, 29. November 2010 10:49
    Dienstag, 23. November 2010 13:57

Alle Antworten

  • Ich tippe mal, dass die Core_D.Lib nicht neu übersetzt wurde mit VS-2010.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 19. November 2010 18:00
    Moderator
  • Hallo Martin,

    ich habe extra nochmal einen Batch Build mit Rebuild all gemacht:

    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon90 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH90.lib
    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon80 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH80.lib
    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon7 Win32 ------
       Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH7.lib
    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon71 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH71.lib
    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon6 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH6.lib
    ------ Rebuild All started: Project: Vision, Configuration: Release Halcon61 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH61.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon90 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH90_D.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon80 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH80_D.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon7 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH7_D.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon71 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH71_D.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon6 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH6_D.lib
    ------ Rebuild All started: Project: Vision, Configuration: Debug Halcon61 Win32 ------
      Vision.vcxproj -> R:\MCPP\Modules\Vision\..\..\Lib\VisionH61_D.lib
    ------ Rebuild All started: Project: UI_Lib, Configuration: Release Win32 ------
      UI_Lib.vcxproj -> R:\MCPP\Modules\UI\UI_Lib\..\..\..\Lib\UI_D.lib
    ------ Rebuild All started: Project: Tools, Configuration: Release Win32 ------
      Tools.vcxproj -> R:\MCPP\Modules\Tools\..\..\Lib\Tools.lib
    ------ Rebuild All started: Project: Tools, Configuration: Debug Win32 ------
      Tools.vcxproj -> R:\MCPP\Modules\Tools\..\..\Lib\Tools_D.lib
    ------ Rebuild All started: Project: RTX, Configuration: Release Win32 ------
      RTX.vcxproj -> R:\MCPP\Modules\RTX\..\..\Lib\RTX.lib
    ------ Rebuild All started: Project: RTX, Configuration: Debug Win32 ------
      RTX.vcxproj -> R:\MCPP\Modules\RTX\..\..\Lib\RTX_D.lib
    ------ Rebuild All started: Project: Print, Configuration: Release Win32 ------
      Print.vcxproj -> R:\MCPP\Modules\Print\..\..\Lib\Print.lib
    ------ Rebuild All started: Project: Print, Configuration: Debug Win32 ------
      Print.vcxproj -> R:\MCPP\Modules\Print\..\..\Lib\Print_D.lib
    ------ Rebuild All started: Project: Measure, Configuration: Release Win32 ------
      Measure.vcxproj -> R:\MCPP\Modules\Measure\..\..\Lib\Measure.lib
    ------ Rebuild All started: Project: Measure, Configuration: Debug Win32 ------
      Measure.vcxproj -> R:\MCPP\Modules\Measure\..\..\Lib\Measure_D.lib
    ------ Rebuild All started: Project: MeasApp, Configuration: Release Win32 ------
      MeasApp.vcxproj -> R:\MCPP\Modules\MeasApp\..\..\Lib\MeasApp.lib
    ------ Rebuild All started: Project: MeasApp, Configuration: Debug Win32 ------
      MeasApp.vcxproj -> R:\MCPP\Modules\MeasApp\..\..\Lib\MeasApp_D.lib
    ------ Rebuild All started: Project: InOut, Configuration: Release Win32 ------
      InOut.vcxproj -> R:\MCPP\Modules\InOut\..\..\Lib\InOut.lib
    ------ Rebuild All started: Project: InOut, Configuration: Debug Win32 ------
      InOut.vcxproj -> R:\MCPP\Modules\InOut\..\..\Lib\InOut_D.lib
    ------ Rebuild All started: Project: IODrivers, Configuration: Release Win32 ------
      IODrivers.vcxproj -> R:\MCPP\Modules\IODrivers\..\..\Lib\IODrivers.lib
    ------ Rebuild All started: Project: IODrivers, Configuration: Release_K90 Win32 ------
      IODrivers.vcxproj -> R:\MCPP\Modules\IODrivers\..\..\Lib\IODriversK90.lib
    ------ Rebuild All started: Project: IODrivers, Configuration: Debug Win32 ------
      IODrivers.vcxproj -> R:\MCPP\Modules\IODrivers\..\..\Lib\IODrivers_D.lib
    ------ Rebuild All started: Project: IODrivers, Configuration: Debug_K90 Win32 ------
      IODrivers.vcxproj -> R:\MCPP\Modules\IODrivers\..\..\Lib\IODriversK90_D.lib

    ------ Rebuild All started: Project: Core, Configuration: Release Win32 ------
      Core.vcxproj -> R:\MCPP\Modules\Core\..\..\Lib\Core.lib
    ------ Rebuild All started: Project: Core, Configuration: NOKIAT Win32 ------
      Core.vcxproj -> R:\MCPP\Modules\Core\..\..\Lib\Core_NO_KIAT.lib
    ------ Rebuild All started: Project: Core, Configuration: NOKIAT_D Win32 ------
      Core.vcxproj -> R:\MCPP\Modules\Core\..\..\Lib\Core_NO_KIAT_D.lib

    ****************************************************************************
    ------ Rebuild All started: Project: Core, Configuration: Debug Win32 ------
      Core.vcxproj -> R:\MCPP\Modules\Core\..\..\Lib\Core_D.lib
    ****************************************************************************

    ------ Rebuild All started: Project: COM_Lite, Configuration: Release Win32 ------
      COM_Lite.vcxproj -> R:\MCPP\Modules\COM_Lite\..\..\Lib\COM_Lite.lib
    ------ Rebuild All started: Project: COM_Lite, Configuration: Debug Win32 ------
      COM_Lite.vcxproj -> R:\MCPP\Modules\COM_Lite\..\..\Lib\COM_Lite_D.lib
    ------ Rebuild All started: Project: Application, Configuration: Release Win32 ------
      Application.vcxproj -> R:\MCPP\Modules\Application\..\..\Lib\Application.lib
    ------ Rebuild All started: Project: Application, Configuration: NOKIAT Win32 ------
      Application.vcxproj -> R:\MCPP\Modules\Application\..\..\Lib\ApplicationNOKIAT.lib
    ------ Rebuild All started: Project: Application, Configuration: NOKIAT_D Win32 ------
      Application.vcxproj -> R:\MCPP\Modules\Application\..\..\Lib\ApplicationNOKIAT_D.lib
    ------ Rebuild All started: Project: Application, Configuration: Debug Win32 ------
      Application.vcxproj -> R:\MCPP\Modules\Application\..\..\Lib\Application_D.lib
    ========== Rebuild All: 40 succeeded, 0 failed, 0 skipped ==========

    Die Core_D.lib wird definitiv neu kompiliert. TSet und TCrystalState sind auch beide in der Core(_D).lib.

    Herzliche Grüsse
    Walter

     

    Dienstag, 23. November 2010 08:56
  • Hmm. OK, wenn ich es genauer lese, konnte die Ursache nicht in dem falschen Build der LIB liegen.
     Du übergibst ein Objekt TXtlState an den Operator << und >>
    Ich kann nicht sehen, dass einer Deiner Operatoren TXtlState aufnehmen kann.

    Was ist TXtlState was macht die Funktion value?
    Hier funktioniert scheinbar die Typenauflösung nicht. Du musst noch einen operator>> definiert haben, der aber keine Implementierung hat.
    Sonst würde der Linker nicht motzen, sondern der Compiler.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 23. November 2010 09:17
    Moderator
  • VC6 war wirklich toll -.- Der Knackpunkt sind die hier:

    friend Tostream& operator<< (Tostream&, const TSet&);
    friend Tistream& operator>> (Tistream&, TSet&);

    Diese Funktionen existieren nicht. Man ist vielleicht geneigt,

    template<class T> Tostream& operator<< (Tostream& stream, const TSet<T>& set);

    und

    template<class T> Tostream& operator>> (Tostream& stream, TSet<T>& set);

    so zu interpretieren – und VC6 mag das fälschlicherweise durchgehen gelassen haben – aber es sind komplett unterschiedliche Funktionen, da das, was du als Freunde vordeklariert hast, keine Templates sind, die definierten Operatoren hingegen schon. Darum musst du die Freunddeklarationen ändern:

    template<class T> friend Tostream& operator<< (Tostream&, const TSet<T>&);
    template<class T>friend Tistream& operator>> (Tistream&, TSet<T>&);

    Das alles ist mir zu viel Quelltext um alle Fehler zu suchen, aber es kann durchaus sein, dass du diesen Fehler an noch viel mehr Stellen korrigieren müssen wirst, damit alles kompiliert.

    Gruß

    • Als Antwort markiert Walter Eicher Montag, 29. November 2010 10:49
    Dienstag, 23. November 2010 13:57
  • Hallo Martin und Krishty,

    erstmal besten Dank für Eure Hilfe. Ich werde das später weiterverfolgen.

    Leider war meine bisherigen Bemühungen zum Portieren der alten Programme auf VS2010 für die Katze :-(

    Obwohl ich in VS2010 das Toolset V90 angegeben habe, wird der Remote Debugger von VS2010 benutzt. Der VS2010 Remote Debugger Client läuft aber nicht unter Win2000 und mit dem VS2008 Remote Debugger Client will VS2010 nicht.

    Es bleibt mir also nichts anderes übrig als die ganze Übung nochmals für VS2008 zu machen.

    Hintergrund:

    Ohne Remote Debugging geht bei uns gar nichts. Unsere Programme sind nur Lauffähig wenn die komplette Maschine (Laser Tuner, Sortiermaschine, SMD Taper usw.) vorhanden ist. 

    Wir haben hier in der Schweiz und in Asien über 200 Maschinen welche unter Win2000 in der Produktion laufen. Wir sind nur zwei Programmierer und somit ist es illusorisch einen Update dieser Maschinen auf ein neueres OS zu machen. Ein weiteres Argument gegen den Update ist, dass die Version der Machine Vision Software auf ca. 50 Maschinen wahrscheinlich nicht mal unter XP läuft. Da wir aber die neuen Programme mit VS2010 für Windows 7 schreiben, laufen unsere neuen Entwicklungsrechner auch unter Windows7. Das schliesst dann den Einsatz von VS6 aus (die XP Box kann man IMHO vergessen).

    Herzliche Grüsse
    Walter

     

     

    Mittwoch, 24. November 2010 09:20
  • Da wir aber die neuen Programme mit VS2010 für Windows 7
    schreiben, laufen unsere neuen Entwicklungsrechner auch unter Windows7. Das
    schliesst dann den Einsatz von VS6 aus (die XP Box kann man IMHO vergessen).

    Wieso?
    VS6 läuft doch unter Windows7... Ich wüsste nichts gegenteiliges.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 24. November 2010 10:49
    Moderator
  • Hallo Martin,

    ich hab's auf meinem DELL PRECISION M6500 unter Windows7 64Bit nicht zum laufen gebracht und bin laut Google Resultaten nicht der einzige.

    Wenn Du aber einen Link auf eine Anleitung hast, dann wäre das Super.

    Herzliche Grüsse
    Walter

    Mittwoch, 24. November 2010 12:25
  • Hmmm. Ich habe eigentlich eher nichts gegenteiliges gehört.
    Was sind Deine Quellen, die es vergeblich versucht haben?

    Nach dem was ich weiß sollte man UAC ausschalten VC6 installieren und UAC einschalten... So habe ich es auch unter Vista erfolgreich gehandhabt.

    Was passiert?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 24. November 2010 13:31
    Moderator
  • Hallo Martin,

    zB. im Visual C++ Developper Center. (help installation of visual c++ 6 in win7)

    UAC hat mich derart genervt, dass ich es ausgeschaltet habe.

    Ich weiss auch nicht mehr genau welche Fehlermeldungen auftraten. Aber soweit ich noch weiss konnte ich nicht mal die IDE starten. Einer meiner Kollegen hat es auch probiert und da kam die IDE hoch war aber dann "not responding".

    Ich möchte eigentlich diesen Versuch nicht wiederholen. Es ist ja auch nicht schlecht, wenn der alte Code mal durch einen modernen Compiler überprüft wird. Wir werden noch einige Zeit mit diesem Code leben müssen. Neben den hier nachgefragten Fehlern habe ich noch einige Unschönheiten gefunden und beseitigt. Soviel Arbeit ist es eigentlich nicht, ich glaube bis Ende Woche bin ich mit der Umstellung Fertig.

    Herzliche Grüsse
    Walter

     

    Mittwoch, 24. November 2010 14:49
  • Ich habe es eben mal schnell virtuell für Windows7 Starter 32bit probiert.

    VC6 lässt sich installieren.
    SP6 lässt sich installieren.
    VC6 startet.
    VC6 kann Projekte bearbeiten, kompilieren und debuggen.

    Diverse Kompatibilitätswarnungen habe ich alle ignoriert.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 24. November 2010 15:05
    Moderator
  • Hallo Martin und Kristhy,

    nochmals vielen Dank für Eure Unterstützung.

    Zwei Applikationen übersetzt mit VS9 laufen nun in der Produktion. Eine davon nutzt intensiv die Hardware (Schrittmotoren, AnalogIO, DigitalIO und USB Kamera) die andere, unsere meist eingesetzte Applikation benutzt SQLite und auch etwas IO. Beide laufen nach ein wenig debugging besser (gefühlt ;-)) als je zuvor.

    Herzliche Grüsse
    Walter

     

    Donnerstag, 2. Dezember 2010 13:48