Wie kann ich meine C-Quelldateien kompilieren, ohne eine main
in ihnen funktionieren?
Ich erhalte eine Fehlermeldung für die .c
Dateien, die keine Hauptfunktion haben und die Hauptfunktion nicht nur zum Kompilieren hinzufügen müssen.
some_id
Wie kann ich meine C-Quelldateien kompilieren, ohne eine main
in ihnen funktionieren?
Ich erhalte eine Fehlermeldung für die .c
Dateien, die keine Hauptfunktion haben und die Hauptfunktion nicht nur zum Kompilieren hinzufügen müssen.
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
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 main
aber 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.
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
Für MSVC (Visual Studio,
cl
) siehe stackoverflow.com/questions/2727187/… .– Benutzer202729
22. September 2018 um 11:44 Uhr