2012-12-10 4 views
4

J'ai écrit un Makefile et je n'arrive pas à le faire fonctionner. J'ai une option qui est censée sélectionner le processeur à compiler. Cependant, quand je lance make de la ligne de commande, il dit:Erreur: mauvaise valeur pour -march = commutateur

[email protected]:~/emulators/nintendo sdks/3DS SDK [HomeBrew]$ make 
gcc -march=arm7tdmi -static -fexceptions -fnon-call-exceptions -fstack-check test.c -c 
test.c:1:0: error: bad value (arm7tdmi) for -march= switch 

make: *** [ALL] Error 1 

Mais dans les pages de manuel pour gcc, il déclare que ARM7TDMI est une valeur admissible. Est-ce que je manque quelque chose?

Makefile:

#3DS Compilation Makefile (c) TanDex (TEQ)RunawayFreelancers 
# 
#Version 0.99 (Alpha) For *nix Devices 
# 
#Please Check Back Soon for 3rd SDK 

#SELECT THE COMPILER TO USE! GCC RECOMMENDED! 
#FOR SANITY SAKE, USE C FILES WITH GCC AND CPP FILES WITH G++ 
CC=gcc 
#CC=g++ 

#OBJECTCOPY REFERENCE, DO NOT REMOVE 
OBJC=objcopy 
OBJREFS= -O Binary 

#SELECT THE PROCESSOR TO TUNE IT TO. ARMV7 (Nintendo DS) or ARMV9(Nintendo DS 
(Graphical Support)) 
#or ARM11 Core ARM1176JZ-S and ARM1176JZF-S (3DS Processor? Not Sure if Correct. Try 
and see if they Work?) 
# 
#NOTE: DS GAMES REQUIRE BOTH A ARM7 AND ARM9 BINARY. RUN THIS TWICE (ONCE FOR EACH) 
# 
#UNCOMMENT FOR PROCESOR 

PROCESSOR=arm7tdmi 
#PROCESSOR=arm946e-s 
#PROCESSOR=arm1176jz-s 
#PROCESSOR=arm1176jzf-s 

#FILES 
# 
#PLACE ALL OF THE FILES HERE, THAT ARE BEING COMPILED! 
FILES=test.c 

#SET BIN FILE NAME BASED ON PROCESSOR SELECTED 
ifeq($(PROCESSOR),arm7tdmi)\ 
NAME=ARM7.BIN 
ifeq($(PROCESSOR), arm946e-s)\ 
NAME=ARM9.BIN 
ifeq($(PROCESSOR), arm1176jz-s)\ 
NAME=ARM11.BIN 
ifeq($(PROCESSOR), arm1176jzf-s)\ 
NAME=ARM11.BIN 

#CREATE OBJECTS 
ifeq($(CC), gcc)\ 
OBJECTS=$(FILES:.c=.o) 
ifeq($(CC), g++)\ 
OBJECTS=$(FILES:.cpp=.o) 

#FLAGS! DO NOT CHANGE THESE!!!!!!!!!!! THAT MEANS YOU!!!!! 
# 
#FOR THOSE WHO WANT TO KNOW WHAT THESE DO, HERE THEY ARE: 
#-mtune=$(PROCESSOR)  FORE THE COMPILER TO TUNE OUTPUT TO THE SPECIFIED 
PROCESSOR 
#-static   REQUIRED FOR CLEAN BINARY OUTPUT?? (NOT SURE WHAT THIS 
DOES, BUT WAS SUGESTED ON A POST ON STACKOVERFLOW) 
#-fexceptions   FORCE EXCEPTIONS 
#-fnon-call-exceptions  FORCE EXCEPTIONS TO ONLY BE RETURNED BY THE SYSTEM 
(MEMORY AND FPU INSTRUTIONS FOR EXAMPLE) 
#-fstack-check   FORCE STACK CHECKING (DS/3DS USE AWKWARD STACK 
IMPLEMENTATION) 
CFLAGS=-march=$(PROCESSOR) -static -fexceptions -fnon-call-exceptions -fstack-check 

ALL: 
$(CC) $(CFLAGS) $(FILES) -c 
.c.o: 
$(OBJC) $(OBJREFS) $(OBJECTS) $(NAME) 
.cpp.o: 
$(OBJC) $(OBJREFS) $(OBJECTS) $(NAME) 

Répondre

5

Vous n'êtes probablement pas appelez le gcc droit. Vous semblez appeler le gcc installé dans votre système, plutôt que celui fourni avec le SDK 3DS.

+0

non, cela est fabriquerons fichier. le 3ds sdk est un autre projet sur lequel je travaille en même temps. maintenant c'est juste un dossier avec un fichier test.c pour tester le fichier make –

+1

@AlexanderFrankland Qu'est-ce qui vous fait croire que votre version de GCC, telle qu'elle est livrée par votre distribution Linux, pourrait avoir un support pour les processeurs ARM? Je doute que le support pour autre chose que x86. –

+1

'gcc -v 2> & 1 | grep "Target" 'vous indiquera la cible pour laquelle le compilateur est construit. Comme le dit Nikos, vous avez probablement besoin de localiser/construire un paquet de compilateur croisé. Chacune des CPU listées sur cette page: http://gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html a son propre ensemble de valeurs '-march' acceptables. –

1

Il semble que le problème est avec -march=arm7tdmi.

Je pense que la solution consiste à éviter d'utiliser -march=arm7tdmi; et utiliser -march=cpu-type, où cpu-type est l'un de ceux énumérés à 3.17.4 ARM Options du manuel de GCC.

est ici une partie de la page:

-march=name

This specifies the name of the target ARM architecture. GCC uses this name to determine what kind of instructions it can emit when generating assembly code. This option can be used in conjunction with or instead of the -mcpu= option. Permissible names are: ‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv4t’, ‘armv5’, ‘armv5t’, ‘armv5e’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6t2’, ‘armv6z’, ‘armv6kz’, ‘armv6-m’, ‘armv7’, ‘armv7-a’, ‘armv7-r’, ‘armv7-m’, ‘armv7e-m’, ‘armv7ve’, ‘armv8-a’, ‘armv8-a+crc’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’.

+0

Je suis sûr que l'autre réponse est correcte. Il utilise le système gcc, qui cible les processeurs Intel, plutôt qu'un gcc de compilation croisée qui ciblerait le processeur ARM dans une Nintendo 3DS. –

Questions connexes