VC++6-Windows-Kode in Embarcaderos C++-Builder XE4



  • Hallo,

    ich habe einige Einführungsbücher zu C++ durchgeackert, die aber bisher ausschließlich Beispiele zu Konsolenanwendungen brachten. Hier funktionierte der x64-Embarcadero-Compiler (bcc64.exe) auch absolut tadellos. Aber wer lernt schon C++, um ständig nur Konsolenprogramme zu schreiben?

    Ich habe mir deshalb Charles Petzolds Entwicklerhandbuch zur API-Programmierung gekauft und dachte, ich könnte dessen Beispiele ebenso problemlos übernehmen wie die Konsolenbeispiele aus den anderen Büchern. Petzold selbst schreibt, daß er Visual C++ 6 verwendet, aber auch in Visual Studio 2012 funktionieren seine Beispiele problemlos, beim Embarcadero-Compiler hingegen nicht. Wenn ich z.B. das allererste simple MessageBox-Beispiel

    /*-------------------------------------------------------------- 
       HelloMsg.c -- Displays "Hello, Windows 98!" in a message box 
                     (c) Charles Petzold, 1998 
      --------------------------------------------------------------*/ 
    #include <windows.h> 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                        PSTR szCmdLine, int iCmdShow) 
    { 
         MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0) ; 
         return 0 ; 
    }
    

    kompiliere, erhalte ich immer die Fehlermeldung

    `D:\Programmierung\C-Programme>Embarcadero C++ 6.60 for Win64 Copyright (c) 2012-2013 Embarcadero Technologies, Inc.

    HelloMsg.c:

    Turbo Incremental Link64 6.50 Copyright (c) 1997-2013 Embarcadero Technologies, Inc.

    Error: Unresolved external 'main' referenced from D:\PROGRAMMIERUNG\C++ BUILDER XE4\LIB\WIN64\RELEASE\C0X64.O

    bcc64: error: Befehl linker mit Beendigungscode 2 fehlgeschlagen (mit -v können Sie den Aufruf anzeigen)`

    Dieser Fehler tritt, wie gesagt, nur bei Quellkode für Windows-Anwendungen mit einer WinMain-Hauptfunktion auf; Quelltexte für Konsolenanwendungen mit einer Main-Hauptfunktion werden problemlos kompiliert.

    Kann mir einer von Euch sagen, mit welchen Optionen ich bcc64.exe aufrufen muß, damit der Embarcadero-Compiler auch solche Windows-Quelltexte korrekt kompiliert und linkt? Oder muß ich gar Petzolds Quelltext umschreiben? Bei Visual Studio 2012 war das, wie gesagt, nicht nötig.

    Danke



  • Konovaloff schrieb:

    Kann mir einer von Euch sagen, mit welchen Optionen ich bcc64.exe aufrufen muß, damit der Embarcadero-Compiler auch solche Windows-Quelltexte korrekt kompiliert und linkt?

    Bei BCC32 wäre es -tW . BCC64 ist ein völlig anderer Compiler (Clang statt BCC), aber wenn ich mich richtig erinnere, werden einige der althergebrachten Kommandozeilen-Switches weiterhin unterstützt. Das hier spricht auch dafür, daß -tW funktionieren sollte.



  • Hallo audacia,

    hab vielen Dank für Deinen Hinweis, es hat funktioniert. Bleibt noch zu fragen, woher Du wußtest, daß für <value> (bei der Option -t) 'W' einzutragen war, denn auf der von Dir angegebenen Seite gab es keinen Hinweis darauf.

    Was ich ebenfalls nicht verstehe: Der von mir eingangs beschriebene Fehler tritt wohl erst beim Linken auf, d.h., wenn man durch Verwendung der Option -c das Kompilieren vom Linken trennt, so erzeugt

    bcc64 -c HelloMsg.c

    wohl noch eine saubere Objekt-Datei, aber

    ilink64 HelloMsg.o

    keine gültige exe-Datei. Das scheint mir deshalb so, als man über die Option /aa oder -aa dem Linker ja sagen kann, daß er eine Windows-64-exe erzeugen soll (und außerdem gibt es noch eine Option /Tpe, die laut Hilfetext offenbar dasselbe tut), die mit diesen Optionen erzeugte exe-Datei aber bei ihrer Ausführung abstürzt.

    Kannst Du mir bitte erklären, welchen Unterschied es zwischen einer "Borland target executable", also

    bcc64 -tW HelloMsg.c

    einerseits und

    `bcc64 -Xlinker -aa HelloMsg

    oder

    bcc64 -Xlinker -Tpe HelloMsg`

    bzw.

    `bcc64 -c HelloMsg

    ilink64 -aa HelloMsg.o

    oder

    bcc64 -c HelloMsg

    ilink64 -Tpe HelloMsg.o`

    andererseits gibt?

    Vielen Dank



  • Konovaloff schrieb:

    Bleibt noch zu fragen, woher Du wußtest, daß für <value> (bei der Option -t) 'W' einzutragen war

    > bcc32 -h
    Embarcadero C++ 6.31 für Win32 Copyright (c) 1993-2010 Embarcadero Technologies, Inc.
    Verfügbare Optionen (* = Vorgabeeinstellung, xxx = hat Unteroptionen: verwenden Sie -h -X):
    (Hinweis: -X- oder -w-XXX macht in der Regel die mit -X oder -wXXX getroffene Festlegung rückgängig.)
     Im Falle eines Konflikts zweier Optionen wird die zuletzt angegebene verwendet.)
    [...]
    '-h <OPT>' für Hilfe zu einer bestimmten Option oder
        '-h -', um alle verfügbaren Optionen anzuzeigen.
    
    > bcc32 -h -t
    Embarcadero C++ 6.31 für Win32 Copyright (c) 1993-2010 Embarcadero Technologies, Inc.
    Verfügbare Optionen (* = Vorgabeeinstellung, xxx = hat Unteroptionen: verwenden Sie -h -X):
    (Hinweis: -X- oder -w-XXX macht in der Regel die mit -X oder -wXXX getroffene Festlegung rückgängig.)
     Im Falle eines Konflikts zweier Optionen wird die zuletzt angegebene verwendet.)
      -t      Ausführbare Zieldatei angeben
      -tC     Ziel ist eine Konsolenanwendung
      -tW     Ziel ist eine Windows-Anwendung
      -tV     Ziel verwendet das VCL-GUI-Framework
      -tR     Ziel verwendet die dynamische RTL
      -tD     Gemeinsame Bibliothek erzeugen
      -tP     Package erzeugen
      -tM     Ziel hat Multi-Threads
      -tU     Unicode-Anwendung erzeugen
    Hinweis: Unteroptionen für '-t' können in einer einzelnen Option kombiniert werden (-XA -XB => -XAB).
    

    Konovaloff schrieb:

    Kannst Du mir bitte erklären, welchen Unterschied es zwischen einer "Borland target executable" [...] einerseits und [...] andererseits gibt?

    Nein, ich kenne die 64-Bit-Version von C++Builder noch nicht näher. Aber wenn du wissen willst, wie der Compiler den Linker aufruft, und sicher bist, daß es nicht in der Dokumentation nachzulesen ist, kannst du das einfach mit Process Monitor herausfinden.



  • Hallo audacia,

    hast Du eine Ahnung warum der bcc32-Compiler beim obigen MsgBox-Quelltext die Warnungen

    `Warnung W8057 HelloMsg.c 12: Parameter 'hInstance' wird nie verwendet in Funktion WinMain

    Warnung W8057 HelloMsg.c 12: Parameter 'hPrevInstance' wird nie verwendet in Funktion WinMain

    Warnung W8057 HelloMsg.c 12: Parameter 'szCmdLine' wird nie verwendet in Funktion WinMain

    Warnung W8057 HelloMsg.c 12: Parameter 'iCmdShow' wird nie verwendet in Funktion WinMain`

    ausgibt und der bcc64-Compiler nicht? Wie gesagt, es sind nur Warnungen; beide erzeugen eine funktionierende exe-Datei. Trotzdem ist bis auf die Compiler alles gleich; beide wurden mit der Option -tW aufgerufen.

    Danke



  • Konovaloff schrieb:

    hast Du eine Ahnung warum der bcc32-Compiler beim obigen MsgBox-Quelltext die Warnungen...

    Trotzdem ist bis auf die Compiler alles gleich

    Und genau der Compiler ist hier entscheidend, es handelt sich wie gesagt um grundverschieden unterschiedliche. Das die standardmäßig angezeigten Warnungen zwischen 2 Compilern sich unterscheiden ist sehr hoch. Du solltest ohnehin schauen wie die Schalter für die maximale Warnungsstufe ist und diese aktivieren.


Anmelden zum Antworten