[综合信息] GCC开发环境,在makefile添加lib,编译失败(已解决)

[复制链接]
 楼主| Afanx 发表于 2022-11-11 17:46 | 显示全部楼层 |阅读模式
本帖最后由 Afanx 于 2022-11-12 17:32 编辑

测试demo来自:《AN_N32G45x_N32G4FR_N32WB452_N32G43x_N32L43x_N32L40x_GCC开发环境应用笔记_V3.0》

搭建GCC开发环境时,修改makefile文件,把算法库添加进来,但编译失败了。不添加lib,编译可以通过,功能也正常。有大佬实现过在在GCC添加lib吗,求帮忙看看

makefile 部分代码:
  1. ######################################
  2. # Algo libs
  3. ######################################
  4. USELIB = 1
  5. ######################################
  6. # Lib files
  7. ######################################
  8. ifeq ($(USELIB), 1)
  9. SRC_LIB_DIR += ../../../../../../firmware/$(TARGET_PLATFORM)_algo_lib/lib
  10. INC_LIB_DIR += ../../../../../../firmware/$(TARGET_PLATFORM)_algo_lib/inc
  11. LIB_SOURCES = $(foreach DIR3, $(SRC_LIB_DIR), $(wildcard $(DIR3)/*.lib))
  12. LIB_SOURCES_L = $(addprefix -L,$(LIB_SOURCES))
  13. C_LIBS = $(LIB_SOURCES_L)
  14. LIB_INCS = $(foreach DIR4, $(INC_LIB_DIR), $(wildcard $(DIR4)/*.h))
  15. LIB_INCS_PATH = $(sort $(dir $(LIB_INCS)))
  16. LIB_INCS_PATH_I = $(addprefix -I,$(LIB_INCS_PATH))
  17. C_INCLUDES += $(LIB_INCS_PATH_I)
  18. endif

测试n32g45x_algo_common.lib中的函数SetZero_U8()
  1. uint32_t SetZero_U8(uint8_t *dst, uint32_t byteLen);

main.c部分代码:
  1. #include "n32g45x_algo_common.h"
  2. uint8_t dat[8];
  3. int main(void)
  4. {
  5.     /*SystemInit() function has been called by startup file startup_n32g45x.s*/
  6.     LedInit(GPIOA, GPIO_PIN_8);
  7.     for (int i = 0; i < 8; i++)
  8.     {
  9.         dat[i] = i;
  10.     }
  11.     SetZero_U8(dat,6);
  12.     while (1)
  13.     {
  14.         LedBlink(GPIOA, GPIO_PIN_8);
  15.         systick_delay_ms(100);
  16.     }
  17. }

编译后报错信息:
d:/gcc-arm/gnu arm embedded toolchain/10 2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld.exe: build/main.o: in function `main':
E:\Desktop\Nationstech.N32G45x_Library.2.0.0\projects\n32g45x_EVAL\examples\GPIO\LedBlink\GCC/../src/main.c:174: undefined reference to `SetZero_U8'
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:143: build/output.elf] Error 1

提示未定义SetZero_U8函数,是我使用方式不对吗?lib文件在makefile中都有引用了,路径检查了也没问题。


 楼主| Afanx 发表于 2022-11-11 17:50 | 显示全部楼层
这个显示就离谱
 楼主| Afanx 发表于 2022-11-12 17:29 | 显示全部楼层
解决方法:
GCC使用的静态库为.a文件,重新修改库的路径和引用文件。
  1. ######################################
  2. # Algo libs
  3. ######################################
  4. USELIB = 1
  5. ######################################
  6. # Lib files
  7. ######################################
  8. ifeq ($(USELIB), 1)
  9. SRC_LIB_DIR += ../../../../../../firmware/common/V1.0
  10. INC_LIB_DIR += ../../../../../../firmware/common/V1.0
  11. LIB_SOURCES = $(foreach DIR3, $(SRC_LIB_DIR), $(wildcard $(DIR3)/*.a))
  12. # LIB_SOURCES_L = $(addprefix -L,$(LIB_SOURCES))
  13. # C_LIBS = $(LIB_SOURCES_L)
  14. LIB_INCS = $(foreach DIR4, $(INC_LIB_DIR), $(wildcard $(DIR4)/*.h))
  15. LIB_INCS_PATH = $(sort $(dir $(LIB_INCS)))
  16. LIB_INCS_PATH_I = $(addprefix -I,$(LIB_INCS_PATH))
  17. C_INCLUDES += $(LIB_INCS_PATH_I)
  18. endif
注意:.a库不需要添加-L前缀,所以我直接注释了中间LIB_SOURCES_L 和 C_LIBS ,后面直接使用 LIB_SOURCES
上面是通过遍历文件夹方式引用,等同于下面单独添加文件
  1. LIB_SOURCES = \
  2. ../../../../../../firmware/common/V1.0/n32g45x_algo_common.a \
  3. ../../../../../../firmware/common/V1.0/n32g45x_hash.a


然后找到链接命令位置,把LIB_SOURCES添加进来。
  1. $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
  2.         $(CROSS_COMPILE)gcc $(OBJECTS) $(LIB_SOURCES) $(LFLAGS) -T$(LDSCRIPT) -o $@
  3.         $(CROSS_COMPILE)size $@


执行make,我这里报了错:
d:/gcc-arm/gnu arm embedded toolchain/10 2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/bin/ld.exe: error: build/output.elf uses VFP register arguments, ../../../../../../firmware/common/V1.0/n32g45x_algo_common.a(common.o) does not

可能的原因是算法库使用软件浮点运算,而编译参数选了硬件浮点运算,导致不兼容。我的修改方式是将FLOAT-ABI注释,不开硬件浮点运算。
  1. # float-abi
  2. # FLOAT-ABI = -mfloat-abi=hard
  3. # mcu
  4. MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)


最后打印没有报错:
arm-none-eabi-size build/output.elf
   text    data     bss     dec     hex filename
   3624    1088    2600    7312    1c90 build/output.elf
arm-none-eabi-objcopy -O ihex -S build/output.elf build/output.hex
arm-none-eabi-objcopy -O binary -S build/output.elf build/output.bin



hudi008 发表于 2022-12-1 17:41 | 显示全部楼层
为什么不使用keil开发呢              
linfelix 发表于 2022-12-1 18:57 | 显示全部楼层
在keil中使用过lib,一般都是没有问题的。
yorkbarney 发表于 2022-12-3 13:53 | 显示全部楼层
GCC开发环境编译起来好慢呢。              
averyleigh 发表于 2022-12-6 13:40 | 显示全部楼层
makefile文件是使用的插件生成的吗?
 楼主| Afanx 发表于 2022-12-8 14:01 | 显示全部楼层
averyleigh 发表于 2022-12-6 13:40
makefile文件是使用的插件生成的吗?

makefile我也没找到一个合适的插件生成,都是手动写的。这里是参考应用笔记附带的教程里的makefile修改的。
yangxiaor520 发表于 2022-12-11 19:31 来自手机 | 显示全部楼层
之前也遇到过,后来在其它地方看到了解决方法。
YiMichael 发表于 2022-12-16 13:56 | 显示全部楼层
厉害了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

51

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

13

主题

51

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部