1.参考newlib引用静态库
-. 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语言的内建函数
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
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