le fichier a été construit pour non pris en charge le format de fichier qui n'est pas l'architecture d'être lié (x86_64)
J'ai un fichier de build sur OSX Lion
VPATH = src include
CFLAGS ="-I include -std=gnu99"
hello: hello.o
gcc $^ -o $@
hello.o: hello.h hello.c
gcc $(CFLAGS) -c $< -o $@
Mais quand j'essaie de l'exécuter ce fichier j'obtiens l'erreur suivante
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
J'ai essayé d'utiliser le drapeau -arch x86_64
mais toujours la même erreur.
De l'exécution de l' arch
commande donne: i386
.
uname -a
me dit: Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
J'ai aussi essayé d'ajouter le commutateur -march=x86-64
comme décrit dans cette réponse le fichier a été construit pour les architectures i386 qui n'est pas l'architecture d'être lié (x86_64) lors de la compilation OpenCV2.2 pour iOS 4.2 sur Mac OSX 10.6 mais cela n'a pas fonctionné pour moi.
La sortie de la ligne de commande est:
gcc -I include -std=gnu99 -m64 -c include/hello.h -o hello.o
gcc -I include -std=gnu99 -m64 hello.o -o hello
ld: warning: ignoring file hello.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
"_main", referenced from:
start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [hello] Error 1
OriginalL'auteur | 2012-04-16
Vous devez vous connecter pour publier un commentaire.
Réviser le makefile plus comme:
Remarque que j'ai de macro-isée tout sur les lignes de commande. CFLAGS sont utilisés dans toutes les compilations. Ils ne sont pas entourés par des guillemets. Le
-m64
option demande un 64-bits; il ne devrait pas être nécessaire, mais elle rend explicite. Vous n'avez pas encore besoin de la LDFLAGS ou LDLIBS macros (de sorte que vous pourriez omettre sans provoquer vous-même des problèmes), mais ils montrent comment procéder lorsque vous avez besoin de quelques bibliothèques au moment de la liaison.Pour mon propre makefiles, je fais des choses comme:
De cette façon, je peux ajuster juste au sujet de n'importe quel argument pour le compilateur C sur la ligne de commande. Par exemple, pour faire les versions 32 bits, je peux courir:
Etc. L'inconvénient est que je ne me rappelle plus xFLAGn option affecte. Cependant, un rapide coup d'oeil à l'makefile rectifie, et je peux changer la compilation, sans modifier le makefile.
(J'ai aussi souvent l'utilisation
CC="gcc -m64"
à force de 64 bits compilations sur d'autres logiciels.)Qui est surprenant. Pouvez-vous montrer les lignes de commande exécutée? Il devrait y avoir deux, bien sûr: une production de la
.o
fichier, et une tentative pour produire l'exécutable. Qu'advient-il si vous essayez:gcc -o hello hello.c
, la production de l'objet fichier directement à partir du code source? Qu'advient-il si vous déposez le VPATH ligne, ou un commentaire? Où est le fichierhello.c
? Qu'en esthello.h
?J'ai mis à jour la question avec la sortie de la commande afin que je puisse formater
Tenez: la première ligne de commande -
gcc -I include -std=gnu99 -m64 -c include/hello.h -o hello.o
. Ce n'est pas la compilationhello.c
à tous. Jetez un oeil à ce que$^
est censé être; vous avez probablement besoin d'utiliser quelque chose comme$*
ou$<
ou quelque chose pour spécifier le fichier C. Lorsque vous exécutezfile hello.o
, que faut-il vous le dire? Le fichier est vide? Vous pourriez avoir besoin de la listehello.c
avanthello.h
dans les dépendances dehello.o
.Ouf! Le chapitre 10 de la GNU Make manuel couvre les macros comme
$<
et$^
.OriginalL'auteur Jonathan Leffler
J'ai eu ce problème lorsque j'ai accidentellement inclus un .h fichier dans une archive...
OriginalL'auteur cheez
Dans mon cas, l'option-M a été la création de cette question. J'ai ajouté cette option pour les dépendances d'un projet mais d'une certaine manière il a été à l'origine de problèmes.
-M
.OriginalL'auteur user2657341