GCC ARM链接器错误-未定义对'strcmp'的引用

Jus*_*reg 1 c gcc arm std

我有一个TIVA-C微控制器项目,该项目使用arm-none-eabi-gcc进行了编译,尽管我添加了string.h,但是却收到“未定义对strcmp的引用”链接器错误。我正在使用预编译的工具链:gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2从这里:https ://launchpad.net/gcc-arm-embedded/+download 。我的makefile切换:

# define flags
CFLAGS = -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = -T $(LD_SCRIPT) --entry ResetISR --gc-sections
Run Code Online (Sandbox Code Playgroud)

还有其他人也有同样的问题,但是他们在LDFLAGS中打开了-nostd,而我显然没有。我现在没主意了,所以任何提示都会很棒。

Fre*_*pin 6

发生问题是因为您使用-ld直接链接。作为多库工具链,arm-none-eabi具有libc.a(包含所需功能)和其他标准库的多个变体。-ld只是找不到正确的库。

要解决您的问题,请在以下位置修改makefile:

更换:

# define flags
CFLAGS = -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = -T $(LD_SCRIPT) --entry ResetISR --gc-sections
Run Code Online (Sandbox Code Playgroud)

与:

# define flags
COREFLAGS = -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS = -g $(COREFLAGS)
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = $(COREFLAGS) -T$(LD_SCRIPT) -Wl,--entry=ResetISR,--gc-sections
Run Code Online (Sandbox Code Playgroud)

更换:

LD = arm-none-eabi-ld
Run Code Online (Sandbox Code Playgroud)

与:

LD = arm-none-eabi-g++
Run Code Online (Sandbox Code Playgroud)

这个想法很简单-在链接阶段,您传递与体系结构相关的所有选项(所有以开头的内容-m),并且链接器选项以开头-Wl,,多个链接器选项可以用逗号连接,而无需重复该-Wl,前缀。需要对没有前缀-T-L-l

您也可以查看我的示例ARM项目,其中包括一个非常不错的Makefile-我从没有任何库问题。在我的网站上(配置文件中的链接),转到下载> ARM>示例,然后选择您喜欢的一个-没有tiva的示例,但是STM32F4的是最接近的示例。