Wie kompiliert man C-Quellcode ohne Hauptfunktion?

Lesezeit: 3 Minuten

Benutzeravatar von some_id
some_id

Wie kann ich meine C-Quelldateien kompilieren, ohne eine main in ihnen funktionieren?

Ich erhalte eine Fehlermeldung für die .cDateien, die keine Hauptfunktion haben und die Hauptfunktion nicht nur zum Kompilieren hinzufügen müssen.

  • Für MSVC (Visual Studio, cl) siehe stackoverflow.com/questions/2727187/… .

    – Benutzer202729

    22. September 2018 um 11:44 Uhr


Benutzeravatar von Kos
Kos

Auf GCC, der -c Schalter ist, was Sie wollen.

-c bedeutet “kompilieren, nicht verlinken”, und Sie erhalten a name.o Ausgabedatei.

  • Ich finde -c ist so ziemlich Standard für die meisten C-Compiler.

    – JeremyP

    23. April 2011 um 13:03 Uhr

Vigneshs Benutzeravatar
Vignesh

Angenommen, Sie haben hello.c:

#include<stdio.h>
#include<stdlib.h>
_start()
{
   exit(my_main());
}
int my_main()
{
   printf("Hello");
   return 0;
}

Kompilieren als:

gcc  -nostartfiles  hello.c 

und Sie können daraus eine ausführbare Datei erhalten.

  • Können Sie Zitate hinzufügen

    – Grijesh Chauhan

    30. Oktober 2013 um 4:02 Uhr

Verwenden Sie die -c Option Ihres Compilers (funktioniert für GCC, Option wahrscheinlich identisch für andere C-Compiler).

Aus der Manpage von GCC:

Wenn Sie GCC aufrufen, führt es normalerweise Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung durch. Mit den „Gesamtoptionen“ können Sie diesen Vorgang zwischenzeitlich stoppen. Beispielsweise sagt die Option -c, dass der Linker nicht ausgeführt werden soll. Dann besteht die Ausgabe aus Objektdateien, die vom Assembler ausgegeben werden.

Die Verknüpfungsphase ist der Schritt, der sucht main() und beschwert sich, wenn es sie nicht findet.

Du kannst kompilieren einzelne Dateien ohne mainaber du kannst nicht Verknüpfung sie und kann natürlich nicht Lauf sie, da sie keine vollständigen Programme sind. Beachten Sie, dass valgrind kein statisches Analysetool, sondern ein Laufzeittool ist und daher für einzelne Übersetzungseinheiten, die nicht in ein lauffähiges Programm eingebunden sind, nutzlos ist.

Wenn Sie einzelne Dateien testen möchten, ist es üblich, in jede Datei Folgendes einzufügen:

#ifdef UNIT_TEST
int main(int argc, char **argv)
{
    /* unit test code goes here */
}
#endif

Und kompilieren Sie die Datei mit -DUNIT_TEST.

Wenn Sie ohne Verknüpfung kompilieren möchten, sind die obigen Antworten richtig, verwenden Sie die -c Schalter. Wenn Sie eine “freistehende” ausführbare Datei wünschen, verwenden Sie die -entry:function Schalter. Die ausführbare Standard- oder “gehostete Umgebung” hat den Einstiegspunkt als -entry:mainCRTStartup was ruft main. Beachten Sie, dass, wenn Sie eine machen freestanding ausführbar sind, können Sie die Standardbibliotheken darüber hinaus nicht verwenden freestanding Bibliotheken <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>und <stdnoreturn.h>.

Wann ist ein freestanding ausführbar geschrieben? Kernels und Drivers. Wenn Sie ein Hobby sind os-dev, dann musst du sie schreiben. Wenn Sie für einen Hardwarehersteller arbeiten, z. B. einen Grafikkartenhersteller, müssen Sie Treiber für diesen schreiben.

Einige verwenden die eingebetteten Komponententests, während andere sie als separate Dateien mit bedingter Kompilierung schreiben. Erinnere dich daran #define und makefile Befehle haben ein gewisses Maß an Überschneidung.

Benutzeravatar von GlenL
GlenL

Um ohne main() in gcc zu verlinken, wählen Sie anstelle von main() eine Funktion für den “Eintrag”. Fügen Sie beim Verknüpfen diese Option hinzu:

-e Eintrag

–entry=Eintrag

1407080cookie-checkWie kompiliert man C-Quellcode ohne Hauptfunktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy