解决C库问题法一:更换musl为uclibc 也即更改编译器。 (1).修改/toolchain/Config.in --- a/toolchain/Config.in
+++ b/toolchain/Config.in
​
config LIBC_USE_UCLIBC
select USE_UCLIBC
​
- bool "Use uClibc"
​
- bool "Use uClibc-ng"
depends on !(aarch64 || aarch64_be)
​
- depends on BROKEN || !(arm || armeb || i386 || x86_64 || mips || mipsel || mips64 || mips64el || powerpc)(2).修改/toolchain/uClibc/Makefile --- a/toolchain/uClibc/Makefile
+++ b/toolchain/uClibc/Makefile
​
define Host/SetToolchainInfo
$(SED) 's,^\(LIBC_TYPE\)=.*,\1=$(PKG_NAME),' $(TOOLCHAIN_DIR)/info.mk
​
- $(SED) 's,^\(LIBC_URL\)=.*,\1=http://www.uclibc.org/,' $(TOOLCHAIN_DIR)/info.mk
​
- $(SED) 's,^\(LIBC_URL\)=.*,\1=http://www.uclibc-ng.org/,' $(TOOLCHAIN_DIR)/info.mk
$(SED) 's,^\(LIBC_VERSION\)=.*,\1=$(PKG_VERSION),' $(TOOLCHAIN_DIR)/info.mk
$(SED) 's,^\(LIBC_SO_VERSION\)=.*,\1=$(LIBC_SO_VERSION),' $(TOOLCHAIN_DIR)/info.mk
endef(3).修改toolchain/uClibc/headers/Makefile --- a/toolchain/uClibc/headers/Makefile
+++ b/toolchain/uClibc/headers/Makefile
​
CC="$(TARGET_CC)" \
CPU_CFLAGS="$(TARGET_CFLAGS)" \
ARCH="$(CONFIG_ARCH)" \
​
- pregen \
install_headers
endef(4).如果要修改使用的uclibc-ng版本,需要修改toolchain/uClibc/common.mk里面的版本号和对应sha值。 (5).上述修改完成后,后续make menuconfig里面就可以选择到uclibc-ng了。一路回车选中。 Advanced configuration options (for developers) --->
Toolchain Options --->
C Library implementation (Use musl) --->到这里回车就可以选择uclibc-ng。 法二:makefile里面去掉编译时musl中不存在的库文件也即更改代码。 musl is only one lib file Threads, math, clock_gettime() , etc. are always available without needing -lm , -lpthread , etc. Even the dynamic linker is integrated. Empty libm.a , libpthread.a , etc. are provided for build-time compatibility (and conformance). There is no libm.so , libpthread.so , etc.
即musl不包含uclibc的那些线程库之类的,而是以一个单独的-lc取代了。因此这一类的Lib库不需要也不能在makefile里写,删去这些,加入-lc即可。 - LFLAGS += -lpthread -ldl -luci -lm
+ LFLAGS += -lc -ldl -luci根据比较,musl在嵌入式编译上还是有明显优势的。
|