搜索
bottom↓
回复: 19

linux下编写arm程序,使用arm-linux-gcc,c库函数怎么调用

[复制链接]

出0入0汤圆

发表于 2012-9-15 22:13:33 | 显示全部楼层 |阅读模式
出现下面错误怎么解决
printf.c: In function 'vsprintk':
printf.c:184: warning: implicit declaration of function 'strlen'
printf.c:184: warning: incompatible implicit declaration of built-in function 'strlen'
arm-linux-ld -Tok6410.lds -o uart.elf start.o clock.o uart.o main.o printf.o
printf.o: In function `_do_div':
printf.c:(.text+0x4c): undefined reference to `__aeabi_uidiv'
printf.c:(.text+0x5c): undefined reference to `__aeabi_uidivmod'
printf.o: In function `vsprintk':
printf.c:(.text+0x4d8): undefined reference to `strlen'
make: *** [uart.bin] 错误 1

出0入0汤圆

发表于 2012-9-15 22:19:52 | 显示全部楼层
include 相应头文件

出0入0汤圆

 楼主| 发表于 2012-9-15 22:29:31 | 显示全部楼层
cqv 发表于 2012-9-15 22:19
include 相应头文件

说找不到头文件,,我怎么连接,还有连接到什么地方啊。

出0入0汤圆

 楼主| 发表于 2012-9-15 22:32:38 | 显示全部楼层
error: string.h: No such file or directory

出0入0汤圆

发表于 2012-9-16 10:51:38 | 显示全部楼层
#include <string.h>
找不到文件吗?
你的交叉编译环境OK了吗?
GCC的C库应该有string.h库可以用的。

出0入0汤圆

 楼主| 发表于 2012-9-17 09:13:22 | 显示全部楼层
cqv 发表于 2012-9-16 10:51
#include
找不到文件吗?
你的交叉编译环境OK了吗?

我相应的文件夹能找到string.h这个文件,我怎么连接到我编译的程序中啊。include之后还需要做什么?

出0入0汤圆

发表于 2012-9-17 22:06:42 | 显示全部楼层
编译看出现什么error,就是error: string.h: No such file or directory吗?

出0入0汤圆

 楼主| 发表于 2012-9-18 09:50:46 | 显示全部楼层
cqv 发表于 2012-9-17 22:06
编译看出现什么error,就是error: string.h: No such file or directory吗?

是的  如果不添加这个头文件,就说strlen没有定义

出0入0汤圆

发表于 2012-9-18 20:21:59 | 显示全部楼层
.......你重新搭建一个arm-linux-gcc环境试试吧。
标准的怎么会出现这些问题呢。

出0入0汤圆

发表于 2012-9-21 13:28:21 | 显示全部楼层
我也遇到过,因为只包含头文件是不够的,还需要把实现头文件中声明的函数的库包含进来。

出0入0汤圆

 楼主| 发表于 2012-9-25 12:30:22 | 显示全部楼层
zyp000 发表于 2012-9-21 13:28
我也遇到过,因为只包含头文件是不够的,还需要把实现头文件中声明的函数的库包含进来。 ...

具体怎么操作?

出0入0汤圆

发表于 2012-9-25 13:04:44 | 显示全部楼层
确定一下你的是编译链是否有C库吧
如果有C库支持(glibc),有的话,只需要编译的时候加上 -lm 加载数学函数库就OK了。
有些编译链是没有C库的,同样能编译能链接,适合裸机程序的开发。

我当时自己创建裸机编译链的时候也遇到了同样的问题,当时做了点笔记,你可以看看吧,有没有帮助就不知道了。
--------------------------------------------------------------------------
裸机编译链不能有C库,所以很多东西就没有了

1,连接的时候要使用 LD ,而不能使用 GCC ,因为 GCC 默认会连接库 -lgcc ,而 LD 可以完全是裸机的,有多少代码只连接多少。

2,连接的时候不要标准库
LDFLAGS += -nostartfiles
LDFLAGS += -nostdlib

3,然后没有了标准库就没有了 printf 函数,于是只能自己移植,然而移植的过程中提示缺 __aeabi_idiv ,因为做了除法,但是系统没有库就悲剧,于是只能将这个库也移植。代码来自
linux代码中 \linux-2.6.22.6\arch\arm\lib\lib1funcs.S ,只需要将里面的 ENTRY(XX) 修改
为 .globl xxx 就OK了,表示到处标号。

只要搞定这个最重要的东东,其他的都是基本内容而已,一直按照经验移植就是了。

Etual
2012-3-25

出0入0汤圆

发表于 2012-9-25 13:09:45 | 显示全部楼层
工具链不全?工具链需要安装到指定位置?
反正大多数情况是工具链的问题!

出0入0汤圆

发表于 2012-9-25 13:15:21 | 显示全部楼层
楼主重新安装工具链试试吧。

出0入0汤圆

发表于 2012-9-25 15:21:31 | 显示全部楼层
12楼正解哦。

出0入0汤圆

发表于 2012-11-1 14:14:37 | 显示全部楼层
12楼强大,学习了

出0入0汤圆

发表于 2012-11-2 10:22:22 来自手机 | 显示全部楼层
也有可能是权限的问题

出0入0汤圆

发表于 2018-1-8 11:21:26 | 显示全部楼层
本帖最后由 alex315000 于 2018-1-8 13:30 编辑

需要自己实现 printfk函数

我现在遇到了这样的情况,裸机

需要用到 math.h 中的 sin cos sqrt等函数.

能否直接这样使用:
拷贝 /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/include/math.h到 {projectname}/include 文件夹

mian.c
#include “math.h”
main()
{
***
a=cos(PI);

***
}
编译时加上
arm-linux-gcc ***** -L/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/libm.a

math.h内报错。。。。






出0入0汤圆

发表于 2018-3-22 17:06:55 | 显示全部楼层
好贴,经验之谈啊

出0入0汤圆

发表于 2018-4-24 09:36:21 | 显示全部楼层
-L编译的时候加上链接库路径就好了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 09:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表