编译时有时会遇到这种错误:
undefined reference to `__udivdi3'
嵌入式中,32位系统中(目前多数系统都是,比如ARM的片子),对于普通的a除以b(b为32位):
(1)当a为32位,Linux 内核中,常用uint32_t 类型,可以直接写为 a/b
(2)但是,对于a是64位,uint64_t的时候,就要用到专门的除操作相关的函数,linux内核里面一般为
do_div(n, base),注意,此处do_div得到的结果是余数,而真正的a/b的结果,是用a来保存的。
do_div(n,base)的具体定义,和当前体系结构有关,对于arm平台,在include/asm-arm/div64.h
因此,如果你当前写代码,a/b,如果a是uint64_t类型,那么一定要利用do_div(a,b),而得到结果a,
而不能简单的用a/b,否则编译可以正常编译,但是最后链接最后出错,会提示上面的那个错误:
undefined reference to "__udivdi3"
本文详细介绍了在Linux内核中处理64位整数除法的方法,特别是针对ARM平台上的实现细节。文章解释了为什么直接使用简单的除法运算符会导致链接错误,并提供了正确的做法,即使用do_div函数来完成除法运算。
2545

被折叠的 条评论
为什么被折叠?



