Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC ARM链接器错误-未定义对';strcmp&x27;_C_Gcc_Arm_Std - Fatal编程技术网

GCC ARM链接器错误-未定义对';strcmp&x27;

GCC ARM链接器错误-未定义对';strcmp&x27;,c,gcc,arm,std,C,Gcc,Arm,Std,我有一个TIVA-C微控制器项目,使用arm none eabi gcc编译,尽管我添加了string.h,但我得到了“未定义的strcmp引用”链接器错误。我正在使用预编译的工具链:gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2,从这里开始:。我的makefile开关: # define flags CFLAGS = -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=soft

我有一个TIVA-C微控制器项目,使用arm none eabi gcc编译,尽管我添加了string.h,但我得到了“未定义的strcmp引用”链接器错误。我正在使用预编译的工具链:gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2,从这里开始:。我的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

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

当您使用嵌入式工具链时,如果没有您的指示,它可能不会链接到libc。将
-lc
添加到您的LDFLAGS以查看它是否解决了问题,因为这至少会尝试链接到libc。

当您使用嵌入式工具链时,如果没有您的指示,它可能不会链接到libc。将
-lc
添加到您的LDFLAGS,以查看它是否解决了问题,因为这至少会尝试链接到libc。

出现问题是因为您使用-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
LD = arm-none-eabi-ld
与:

替换:

# 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
LD = arm-none-eabi-ld
与:

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


您还可以查看我的示例ARM项目,其中包括一个非常好的Makefile—我从未遇到过任何库问题。在我的网站(档案中的链接)上,点击下载>ARM>示例,选择您喜欢的示例-tiva没有示例,但STM32F4的示例将是最接近的匹配项。

出现问题的原因是您使用-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
LD = arm-none-eabi-ld
与:

替换:

# 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
LD = arm-none-eabi-ld
与:

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



您还可以查看我的示例ARM项目,其中包括一个非常好的Makefile—我从未遇到过任何库问题。在我的网站(个人资料中的链接)上,点击下载>ARM>示例,然后选择您喜欢的示例-tiva没有示例,但STM32F4的示例将是最接近的匹配项。

您能给我们显示错误消息吗?请进行测试。只添加对strcmp的引用(只声明函数的原型),然后再次尝试编译。我想检查libc的共享对象是否将被动态链接。如果没有,,那么,您的arm没有正确安装标准C库crosscompilationme@sg:~/\uuu PW\uu/projecttiva$make arm none eabi ld-o build/a.out build/console.o build/cmdline.o build/uartsdio.o build/startup\u gcc.o build/console\u uart.o build/console\u command.o build/board.o build/main.o-T TM4C123GH6PM.ld——条目重置ISR——gc部分build/cmdline.o:In function
CmdLineProcess':/home/me/\uuuu PW\uuuu/projecttiva/src/cmdline.c:169:未定义对
strcmp'make:**[build/a.out]的引用错误1@sestus:我注释掉string.h并放入int strcmp(const char*s1,const char*s2);在相关源文件的顶部。我收到了同样的错误信息。(我希望我正确地解释了你的问题)是的,我就是这个意思。在我看来,链接器似乎无法定位libc共享对象(对于arm)。你确定你安装了它吗?你能给我们看一下错误信息吗?做个测试。只添加对strcmp的引用(只声明函数的原型),然后再次尝试编译。我想检查libc的共享对象是否将被动态链接。如果没有,,那么,您的arm没有正确安装标准C库crosscompilationme@sg:~/\uuu PW\uu/projecttiva$make arm none eabi ld-o build/a.out build/console.o build/cmdline.o build/uartsdio.o build/startup\u gcc.o build/console\u uart.o build/console\u command.o build/board.o build/main.o-T TM4C123GH6PM.ld——条目重置ISR——gc部分build/cmdline.o:In function
CmdLineProcess':/home/me/\uuuu PW\uuuu/projecttiva/src/cmdline.c:169:未定义对
strcmp'make:**[build/a.out]的引用错误1@sestus:我注释掉string.h并放入int strcmp(const char*s1,const char*s2);在相关源文件的顶部。我收到了同样的错误信息。(我希望我正确地解释了你的问题)是的,我就是这个意思。在我看来,链接器似乎无法定位libc共享对象(对于arm)。你确定是你安装的吗?弗雷迪谢谢你的详细回答。我现在可以编译和链接我的代码了。你可能是指LD=arm-none-eabi-gcc而不是LD=arm-none-eabi-g++,对吗?总之,我改了,编译器/链接器也没有抱怨。@JustGreg-你可以使用gcc或g++进行链接-这没关系。另外,只是一个风格上的注释,使用换行符阅读可能比反复附加到
CFLAGS
@OllieFord-纯偏好,我更喜欢
+=
(;@FreddieChopin-Woah,好的。:)Freddie谢谢你的详细回答。我现在可以编译并链接我的代码了。你可能是指LD=arm-