esp32 构建自己的组件 components

1.参考newlib引用静态库

components

-. 1 COMPONENT_ADD_LDFRAMENTS := esp32-spiram-rom-functions.lf
//TODO 组件存储方式

-. 2 COMPONENT_ADD_LDFLAGS
为 LDFLAGS 添加链接器参数以用于应用程序可执行文件.默认为 -l$(COMPONENT_NAME).如果将预编译库添加到此目录,请将它们添加为绝对路径 -e$(COMPONENT_PATH)/libwhatever.a

COMPONENT_ADD_LDFLAGS := $(LIBC_PATH) $(LIBM_PATH) -lnewlib

-. 3 COMPONENT_ADD_LINKER_DEPS

相对组件路径的文件的可选列表,如果它们发生更改,应触发 ELF 文件的重新链接。 通常用于链接描述文件和二进制库。大多数组件不需要设置此变量。

COMPONENT_ADD_LINKER_DEPS := $(LIBC_PATH) $(LIBM_PATH)

-. 4 COMPONENT_ADD_INCLUDEDIRS

相对于组件目录的路径,将添加到项目中所有组件的 “include” 搜索路径.如果未被覆盖,则默认include.如果仅需要编译此特定组件的 “include” 目录,请将其添加到 COMPONENT_PRIV_INCLUDEDIRS

COMPONENT_ADD_INCLUDEDIRS := platform_include include

这样也包括platform_include 文件夹下的头文件

错误例子

COMPONENT_ADD_INCLUDEDIRS := $(COMPONENT_PATH)/platform_include include

其中COMPONENT_PATH:件目录.计算包含 component.mk 的目录的绝对路径.组件路径不能包含空格.
-. 5 syscalls.o: CFLAGS += -fno-builtin
syscalls.c 文件编译规则,其中-fno-builtin表示不使用c语言的内建函数

component.mk


ifdef CONFIG_SPIRAM_CACHE_WORKAROUND
LIBC_PATH := $(COMPONENT_PATH)/lib/libc-psram-workaround.a
LIBM_PATH := $(COMPONENT_PATH)/lib/libm-psram-workaround.a
COMPONENT_ADD_LDFRAGMENTS := esp32-spiram-rom-functions.lf
else

ifdef CONFIG_NEWLIB_NANO_FORMAT
LIBC_PATH := $(COMPONENT_PATH)/lib/libc_nano.a
else
LIBC_PATH := $(COMPONENT_PATH)/lib/libc.a
endif  # CONFIG_NEWLIB_NANO_FORMAT

LIBM_PATH := $(COMPONENT_PATH)/lib/libm.a

endif  # CONFIG_SPIRAM_CACHE_WORKAROUND

COMPONENT_ADD_LDFLAGS := $(LIBC_PATH) $(LIBM_PATH) -lnewlib

COMPONENT_ADD_LINKER_DEPS := $(LIBC_PATH) $(LIBM_PATH)

COMPONENT_ADD_INCLUDEDIRS := platform_include include

syscalls.o: CFLAGS += -fno-builtin

CMakeLists.txt

set(COMPONENT_SRCS "locks.c"
                   "pthread.c"
                   "random.c"
                   "reent_init.c"
                   "select.c"
                   "poll.c"
                   "syscall_table.c"
                   "syscalls.c"
                   "termios.c"
                   "utime.c"
                   "time.c")
set(COMPONENT_ADD_INCLUDEDIRS platform_include include)

if(CONFIG_SPIRAM_CACHE_WORKAROUND)
    set(LIBC c-psram-workaround)
    set(LIBM m-psram-workaround)

    set(COMPONENT_ADD_LDFRAGMENTS esp32-spiram-rom-functions.lf)
else()

    if(CONFIG_NEWLIB_NANO_FORMAT)
        set(LIBC c_nano)
    else()
        set(LIBC c)
    endif()

    set(LIBM m)
endif()

set(COMPONENT_REQUIRES vfs)  # for sys/ioctl.h

register_component()

target_link_libraries(${COMPONENT_TARGET} "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib")
target_link_libraries(${COMPONENT_TARGET} ${LIBC} ${LIBM})

set_source_files_properties(syscalls.c PROPERTIES COMPILE_FLAGS -fno-builtin)

例子:

#
# Component Makefile
#

LIBS_PATH := $(COMPONENT_PATH)/lib/libmylib.a

COMPONENT_ADD_LDFLAGS := $(LIBS_PATH)  -lmylib

COMPONENT_ADD_LINKER_DEPS := $(LIBS_PATH) 

COMPONENT_ADD_INCLUDEDIRS :=  include

能运行
如果是

#

LIBS_PATH := $(COMPONENT_PATH)/lib/libmylib.a

#COMPONENT_ADD_LDFLAGS := $(LIBS_PATH)  -lmylib

COMPONENT_ADD_LDFLAGS := -L $(COMPONENT_PATH)/lib \
							-lmylib
 #                          $(addprefix -l,$(LIBS))

COMPONENT_ADD_LINKER_DEPS := $(LIBS_PATH) 

COMPONENT_ADD_INCLUDEDIRS :=  include

就会出错,看来不能让它自己寻找,推测类似与uNIX下,ldconfig,所以要写绝对路径??

other

#
# component Makefile
#
LIBS_PATH := $(COMPONENT_PATH)/lib/libmyprint.a

COMPONENT_ADD_LDFLAGS := $(LIBS_PATH)  -lmyprint

COMPONENT_ADD_LINKER_DEPS := $(LIBS_PATH) 

COMPONENT_ADD_INCLUDEDIRS := include

COMPONENT_SRCDIRS := src
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值