arm-none-eabi-g++ 正在尝试为桌面而不是 arm 编译
arm-none-eabi-g++ is trying to compile for desktop instead of arm
我有一个 makefile 调用 arm-none-eabi-g++ 来编译一堆文件。如果我给文件一个 .c 扩展名,它就可以工作。如果我将扩展名更改为 .cc,看起来 g++ 正在执行编译而不是 arm-none-eabi-g++。我正在指定 -mcpu=cortex-m0 -mthumb。这是生成文件:
CXX := arm-none-eabi-g++
# -I/usr/lib/arm-none-eabi/include\: since we're compiling with nostdinc and nostdlib, include this directory to grab necessary files
CFLAGS := \
-nostdinc\
-I.\
-I../arch/cortex-m0+\
-I../devices\
-I../libc\
-I/usr/lib/arm-none-eabi/include\
-O0\
-ffunction-sections\
-fdata-sections\
-Wall\
-fmessage-length=0\
-mcpu=cortex-m0\
-mthumb\
-mfloat-abi=soft\
-gdwarf-2\
-g3\
-gstrict-dwarf\
-Wno-unused-but-set-variable\
-Wno-attributes\
-fno-builtin\
-fno-exceptions
objects := \
../libc/math.o\
../libc/malloc.o
radio : $(objects)
math.o : ../libc/math.c ../libc/math.h
$(CXX) $(CFLAGS) -c ../libc/math.c
malloc.o : ../libc/malloc.cc ../libc/malloc.hh
$(CXX) $(CFLAGS) -c ../libc/malloc.cc
clean :
rm radio.elf radio.map $(objects)
这是 make 的输出:
marlon@marlon-Z68X-UD3H-B3:~/projects/firmware$ make
cc -nostdinc -I. -I../arch/cortex-m0+ -I../devices -I../libc -I/usr/lib/arm-none-eabi/include -O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -gdwarf-2 -g3 -gstrict-dwarf -Wno-unused-but-set-variable -Wno-attributes -fno-builtin -fno-exceptions -c -o ../libc/math.o ../libc/math.c
cc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead
cc: error: unrecognized command line option ‘-mthumb’
cc: error: unrecognized command line option ‘-mfloat-abi=soft’
make: *** [../libc/math.o] Error 1
我通过确保在 makefile 中同时设置 CC 和 CXX 解决了这个问题:
CC := arm-none-eabi-gcc
CXX := arm-none-eabi-g++
注意
之间的差异
objects := ../libc/math.o ...
和
math.o: ...
Make 有一个 radio
的规则,它依赖于 objects
,因此依赖于 ../libc/math.o
。由于它不存在,Make 开始寻找构建它的规则。现在,math.o
在当前目录 与 ../libc/math.o
是不同的东西,所以 Make 找不到它想要的用户定义的规则,并最终返回到它的 implicit rules(用 $CC 构建“.c”文件,用 $CXX 构建“.cc”文件)。
换句话说,您的自定义规则适用于不相关的目标 - 您可以简单地指定使事情按预期工作的确切路径,但如果您最终想要更通用的东西,那么值得看看通配符是如何工作的和模式规则有效。
我有一个 makefile 调用 arm-none-eabi-g++ 来编译一堆文件。如果我给文件一个 .c 扩展名,它就可以工作。如果我将扩展名更改为 .cc,看起来 g++ 正在执行编译而不是 arm-none-eabi-g++。我正在指定 -mcpu=cortex-m0 -mthumb。这是生成文件:
CXX := arm-none-eabi-g++
# -I/usr/lib/arm-none-eabi/include\: since we're compiling with nostdinc and nostdlib, include this directory to grab necessary files
CFLAGS := \
-nostdinc\
-I.\
-I../arch/cortex-m0+\
-I../devices\
-I../libc\
-I/usr/lib/arm-none-eabi/include\
-O0\
-ffunction-sections\
-fdata-sections\
-Wall\
-fmessage-length=0\
-mcpu=cortex-m0\
-mthumb\
-mfloat-abi=soft\
-gdwarf-2\
-g3\
-gstrict-dwarf\
-Wno-unused-but-set-variable\
-Wno-attributes\
-fno-builtin\
-fno-exceptions
objects := \
../libc/math.o\
../libc/malloc.o
radio : $(objects)
math.o : ../libc/math.c ../libc/math.h
$(CXX) $(CFLAGS) -c ../libc/math.c
malloc.o : ../libc/malloc.cc ../libc/malloc.hh
$(CXX) $(CFLAGS) -c ../libc/malloc.cc
clean :
rm radio.elf radio.map $(objects)
这是 make 的输出:
marlon@marlon-Z68X-UD3H-B3:~/projects/firmware$ make
cc -nostdinc -I. -I../arch/cortex-m0+ -I../devices -I../libc -I/usr/lib/arm-none-eabi/include -O0 -ffunction-sections -fdata-sections -Wall -fmessage-length=0 -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -gdwarf-2 -g3 -gstrict-dwarf -Wno-unused-but-set-variable -Wno-attributes -fno-builtin -fno-exceptions -c -o ../libc/math.o ../libc/math.c
cc: warning: ‘-mcpu=’ is deprecated; use ‘-mtune=’ or ‘-march=’ instead
cc: error: unrecognized command line option ‘-mthumb’
cc: error: unrecognized command line option ‘-mfloat-abi=soft’
make: *** [../libc/math.o] Error 1
我通过确保在 makefile 中同时设置 CC 和 CXX 解决了这个问题:
CC := arm-none-eabi-gcc
CXX := arm-none-eabi-g++
注意
之间的差异objects := ../libc/math.o ...
和
math.o: ...
Make 有一个 radio
的规则,它依赖于 objects
,因此依赖于 ../libc/math.o
。由于它不存在,Make 开始寻找构建它的规则。现在,math.o
在当前目录 与 ../libc/math.o
是不同的东西,所以 Make 找不到它想要的用户定义的规则,并最终返回到它的 implicit rules(用 $CC 构建“.c”文件,用 $CXX 构建“.cc”文件)。
换句话说,您的自定义规则适用于不相关的目标 - 您可以简单地指定使事情按预期工作的确切路径,但如果您最终想要更通用的东西,那么值得看看通配符是如何工作的和模式规则有效。