打印
[综合信息]

GCC开发环境,在makefile添加lib,编译失败(已解决)

[复制链接]
1161|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 部分代码:
######################################
# Algo libs
######################################
USELIB = 1
######################################
# Lib files
######################################
ifeq ($(USELIB), 1)
SRC_LIB_DIR += ../../../../../../firmware/$(TARGET_PLATFORM)_algo_lib/lib
INC_LIB_DIR += ../../../../../../firmware/$(TARGET_PLATFORM)_algo_lib/inc
LIB_SOURCES = $(foreach DIR3, $(SRC_LIB_DIR), $(wildcard $(DIR3)/*.lib))
LIB_SOURCES_L = $(addprefix -L,$(LIB_SOURCES))
C_LIBS = $(LIB_SOURCES_L)
LIB_INCS = $(foreach DIR4, $(INC_LIB_DIR), $(wildcard $(DIR4)/*.h))
LIB_INCS_PATH = $(sort $(dir $(LIB_INCS)))
LIB_INCS_PATH_I = $(addprefix -I,$(LIB_INCS_PATH))
C_INCLUDES += $(LIB_INCS_PATH_I)
endif

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

main.c部分代码:
#include "n32g45x_algo_common.h"
uint8_t dat[8];
int main(void)
{
    /*SystemInit() function has been called by startup file startup_n32g45x.s*/
    LedInit(GPIOA, GPIO_PIN_8);
    for (int i = 0; i < 8; i++)
    {
        dat[i] = i;
    }
    SetZero_U8(dat,6);
    while (1)
    {
        LedBlink(GPIOA, GPIO_PIN_8);
        systick_delay_ms(100);
    }
}

编译后报错信息:
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文件,重新修改库的路径和引用文件。
######################################
# Algo libs
######################################
USELIB = 1
######################################
# Lib files
######################################
ifeq ($(USELIB), 1)
SRC_LIB_DIR += ../../../../../../firmware/common/V1.0
INC_LIB_DIR += ../../../../../../firmware/common/V1.0
LIB_SOURCES = $(foreach DIR3, $(SRC_LIB_DIR), $(wildcard $(DIR3)/*.a))
# LIB_SOURCES_L = $(addprefix -L,$(LIB_SOURCES))
# C_LIBS = $(LIB_SOURCES_L)
LIB_INCS = $(foreach DIR4, $(INC_LIB_DIR), $(wildcard $(DIR4)/*.h))
LIB_INCS_PATH = $(sort $(dir $(LIB_INCS)))
LIB_INCS_PATH_I = $(addprefix -I,$(LIB_INCS_PATH))
C_INCLUDES += $(LIB_INCS_PATH_I)
endif
注意:.a库不需要添加-L前缀,所以我直接注释了中间LIB_SOURCES_L 和 C_LIBS ,后面直接使用 LIB_SOURCES
上面是通过遍历文件夹方式引用,等同于下面单独添加文件
LIB_SOURCES = \
../../../../../../firmware/common/V1.0/n32g45x_algo_common.a \
../../../../../../firmware/common/V1.0/n32g45x_hash.a


然后找到链接命令位置,把LIB_SOURCES添加进来。
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
        $(CROSS_COMPILE)gcc $(OBJECTS) $(LIB_SOURCES) $(LFLAGS) -T$(LDSCRIPT) -o $@
        $(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注释,不开硬件浮点运算。
# float-abi
# FLOAT-ABI = -mfloat-abi=hard
# mcu
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开发呢              

使用特权

评论回复
5
linfelix| | 2022-12-1 18:57 | 只看该作者
在keil中使用过lib,一般都是没有问题的。

使用特权

评论回复
6
yorkbarney| | 2022-12-3 13:53 | 只看该作者
GCC开发环境编译起来好慢呢。              

使用特权

评论回复
7
averyleigh| | 2022-12-6 13:40 | 只看该作者
makefile文件是使用的插件生成的吗?

使用特权

评论回复
8
Afanx|  楼主 | 2022-12-8 14:01 | 只看该作者
averyleigh 发表于 2022-12-6 13:40
makefile文件是使用的插件生成的吗?

makefile我也没找到一个合适的插件生成,都是手动写的。这里是参考应用笔记附带的教程里的makefile修改的。

使用特权

评论回复
9
yangxiaor520| | 2022-12-11 19:31 | 只看该作者
之前也遇到过,后来在其它地方看到了解决方法。

使用特权

评论回复
10
YiMichael| | 2022-12-16 13:56 | 只看该作者
厉害了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

51

帖子

1

粉丝