EXE statisch Linken (ohne BPLs) bei Konsolen-Programmen



  • Ich habe ein Problem beim statischen Linken von Konsolen-Programmen (also beim Erzeugen einer ausführbaren EXE-Datei ohne runtime Packages) bei BCB 6

    Bei einer normalen Applikation mit VCL und Fenstern geht das ohne Probleme. Man nimmt einfach entsprechend die Option "build with runtime packages" bei den Projektoptionen heraus.

    Wenn ich aber jetzt beispielsweise das folgende Konsolenprogramm auch statisch (ohne Laufzeitbibliotheken) linken möchte:

    #include <vcl.h>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    	Application->MessageBoxA("Hallo", "Welt", 16);
    	return 0;
    }
    //---------------------------------------------------------------------------
    

    dann kommen beim Linken folgende Fehler:

    [Linker Error] Unresolved external 'Forms::Application' referenced from E:\CPP\PROGRAMME\DIVERSES\FOLDERSIZE\UNIT1.OBJ
    [Linker Error] Unresolved external '__fastcall Forms::TApplication::MessageBox(const char *, const char *, int)' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\LIB\RELEASE\VCLE.LIB|_t_Forms
    

    Weshalb sollte das nicht auch gehen?? Wäre echt froh um Hilfe!
    Danke!
    - Adrian



  • Hmm... passen Messageboxen und Konsolenanwendungen zusammen? Braucht ne Message-Box kein Windows (Formular, nicht das OS)-Handle, das sie aufruft? Auf jeden Fall steht da in deiner Fehlermeldung ein paar mal Forms drin... und du hast keins...



  • Hallo,

    Vor allem existiert in einer Konsolenanwendung Applications nicht. Nimm statt Application->MessageBoxA einfach MessageBox.



  • Danke schon mal für die schnellen Antworten.

    Hmm... passen Messageboxen und Konsolenanwendungen zusammen? Braucht ne Message-Box kein Windows (Formular, nicht das OS)-Handle, das sie aufruft? Auf jeden Fall steht da in deiner Fehlermeldung ein paar mal Forms drin... und du hast keins...

    Also das dachte ich am Anfang auch. Aber eben, wenn man das Programm normal linken lässt, gibt es keinerlei Probleme. Offenbar wird als Handle der Desktop genommen.

    Vor allem existiert in einer Konsolenanwendung Applications nicht. Nimm statt Application->MessageBoxA einfach MessageBox.

    Application ist doch in <vcl> definiert und wird dort auch initialisiert, so dass Application zur Verfügung steht. Sonst käme doch eine Zugriffsverletzung? Wie gesagt, wenn ich mit den BCB-Defaults das Programm Compiliere, gehts ja.

    Ich denke auch, dass es etwas mit Application (oder im weiteren einfach mit dem Gebrauch von VCL) zu tun hat. Aber wenn das effektiv verboten wäre bei Konsolenprogrammen, Application zu verwenden, dann würde es ja auch bei der durch Linken mit BPLs erstellten EXE Probleme geben. Irgendwie hat es einfach noch andere Gründe... Oder was meint ihr?
    - Adrian



  • Die Fehlermeldung "Unresolved external" deutet normalerweise darauf hin, dass die entsprechende Variable (oder Funktion) zwar deklariert aber nicht entsprechend definiert wurde (und die entsprechnde Übersetzungseinheit dazugelinkt).



  • Ja, das stimmt. Aber was ich einfach nicht verstehe: Weshalb sollte alles definiert sein, wenn für dynamische Laufzeitbibliotheken gelinkt wird; wenn aber statisch gelinkt wird nicht?? Am Code und an den Includes ändert ja nichts. Und weshalb geht das ganze Spiel problemlos bei Programmen mit Fenstern, weshalb aber nur halb bei Konsolenprogrammen?
    - Adrian


Anmelden zum Antworten