本次采用最新的newlib2.4.0,在http://sourceware.org/newlib/ 网页上找。
1.配置:
root@wuh-Inspiron-5535:/home/wuh/newlib-cygwin/newlib# ./configure --build=x86_64-pc-Linux-gnu --target=arm-none-eabi --prefix=/home/wuh/newlib2.2.0/build --with-newlib --enable-newlib-io-long-long --enable-newlib-register-fini --disable-newlib-supplied-syscalls --disable-nls
--targe=arm-none-eabi,newlib从targe选项解析出目标配置为arm架构,无操作系统,加入相应的newlib编译目录。
--prefix,为newlib的配置安装目录
其中比较重要的编译选项变量CFLAGS_FOR_TARGET,采用Os优化,s3c2416为armv5t指令集,并且没有硬件除法、浮点,必须采用软浮点,如果配置s5pv210的库,应配置成armv7-a指令,采用硬浮点。库采用arm模式编译,二进制接口采用aapcs-linux。可加入其它的配置参数,使生成的newlib库更微小,适应于cortex-m0等单片机应用方案中,相关的配置选项,请查阅相关的newlib资料。
2.编译 make all
因为各个版本交叉编译工具链编译选项等的差异,可能编译出错,根据出错信息进行更正即可。
3.安装 make install 路径为--prefix=/home/wuh/newlib2.2.0/build
4.修改Makefile 指定libm.so库
头部加两行,分别在
arm-linux-gcc 加$(CLDFLAGS)
CLDFLAGS:= -lm
CXXLDFLAGS:= -lm
%.o : %.S
arm-linux-gcc ${CLDFLAGS} -o $@ $< -c
%.o : %.c
arm-linux-gcc ${CLDFLAGS} -o $@ $< -c
现在调用<math.h> sin()等函数的c文件就可以编译通过了。
另:
newlib安装后,会生成一个库头文件目录以及相应的静态库,其中库头文件声明对于标准c库均是一致的,可以直接使用交叉编译工具链默认的c库头文件。主要从newlib中提取出libc.a、libm.a、libnosys.a这三个库。在开发项目时,修改默认的c库路径,使之链接newlib即可。libnosys.a由源码目录下\libgloss\libnosys源代码实现,为newlib操作系统接口层,基本为空实现,避免使用一些c库函数时的链接失败。在实现一些io操作、文件操作、内存分配、时间产生等需要操作系统调用。如果应用程序中未访问这些与系统调用相关的c库函数,无需libnosys.a。