web-dev-qa-db-fra.com

C Linking Error: référence non définie à 'main'

J'ai lu les autres réponses sur ce sujet et, malheureusement, elles ne m'ont pas aidé. Je tente de lier plusieurs programmes c ensemble, et je reçois une erreur en réponse:

$ gcc -o runexp.o scd.o data_proc.o -lm -fopenmp
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: * [runexp] Error 1

J'ai exactement une fonction principale et c'est dans runexp. Le formulaire est 

int main(void) {
    ...; 
    return 0;
}

Des idées sur pourquoi je pourrais avoir cette erreur? Merci!

21
Nicole

Vous devez fournir le nom du fichier de sortie après l'option -o. Dans votre cas, runexp.o est traité comme un nom de fichier de sortie et non comme un fichier objet; votre fonction main n'est donc pas définie.

22
VHaravy

Vous n'incluez pas le fichier C contenant main() lors de la compilation afin que l'éditeur de liens ne le voie pas.

Vous devez l'ajouter:

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp
5
unwind

Vous écrasez votre fichier objet runexp.o en exécutant cette commande:

 gcc -o runexp.o scd.o data_proc.o -lm -fopenmp

En fait, le -o est pour le fichier output file . Vous devez exécuter:

gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp

runexp.out sera votre fichier binaire.

1
Bechir

Généralement, vous compilez la plupart des fichiers .c de la manière suivante:

gcc foo.c -o foo. Cela peut varier selon ce que vous avez utilisé ou si vous avez des fichiers .h externes. Généralement, lorsque vous avez un fichier C, cela ressemble à ce qui suit:

#include <stdio.h>
    /* any other includes, prototypes, struct delcarations... */
    int main(){
    */ code */
}

Lorsque je reçois une «référence non définie à main», cela signifie généralement que j'ai un fichier .c qui n'a pas int main() dans le fichier. Si vous avez appris la première fois avec Java, il s'agit d'une confusion compréhensible car, en Java, votre code se présente généralement comme suit:

//any import statements you have
public class Foo{
    int main(){}
 }

Je conseillerais de regarder pour voir si vous avez int main() en haut.

0
Jordan Effinger