【问题标题】:Error: bad value for -march= switch错误:-march= 开关的错误值
【发布时间】:2012-11-27 11:19:55
【问题描述】:

我写了一个 Makefile,但我无法让它工作。我有一个选项应该选择要编译到哪个处理器。但是,当我从命令行运行 make 时,它会显示:

tandex@tandex-P-6860FX:~/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

但是在 gcc 的手册页中,它指出 arm7tdmi 是一个允许的值。我错过了什么吗?

生成文件:

#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)

【问题讨论】:

    标签: gcc compiler-errors makefile arm embedded


    【解决方案1】:

    您可能没有调用正确的 gcc。您似乎调用的是系统中安装的 gcc,而不是 3DS SDK 附带的 gcc。

    【讨论】:

    • 不,这是自定义制作文件。 3ds sdk 是我正在与此相关的另一个项目。现在这只是一个带有 test.c 文件的文件夹来测试 make 文件
    • @AlexanderFrankland 是什么让您相信您的 GCC 版本(由您的 Linux 发行版提供)可能支持 ARM CPU?我怀疑它是否支持 x86 以外的任何东西。
    • gcc -v 2>&1 | grep "Target" 将告诉您编译器的构建目标。正如 Nikos 所说,您可能需要找到/构建一个交叉编译器包。此页面上列出的每个 CPU:gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html 都有自己的一组可接受的-march 值。
    • 我不知道是我的错。我会寻找一个交叉编译器。
    • @AlexanderFrankland:这里没有错。这不是天生显而易见的。
    【解决方案2】:

    看来问题出在-march=arm7tdmi

    我认为解决方法是避免使用-march=arm7tdmi;并使用-march=cpu-type,其中cpu-type 是GCC 手册3.17.4 ARM Options 中列出的其中之一。

    这是页面的一部分:

    -march=名称

    这指定了目标 ARM 体系结构的名称。 GCC 使用这个名称来确定它在什么时候可以发出什么样的指令 生成汇编代码。此选项可与 或代替 -mcpu= 选项。允许的名称是:'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'。

    【讨论】:

    • 我很确定另一个答案是正确的。他使用的是针对 Intel 处理器的系统 gcc,而不是针对 Nintendo 3DS 中的 ARM 处理器的交叉编译 gcc。
    猜你喜欢
    • 2017-03-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多