导致无法在海湾合作委员会中划分数字的原因是什么

我的情况非常奇怪。 每次我尝试编译我的arm项目(LPC2378,codesourcery arm-none-eabi-gcc-4.5.1)时我都会遇到同样的错误

/media/data/Projects/arm/uart/main.c:39: undefined reference to `__aeabi_uidiv' /media/data/Projects/arm/uart/main.c:40: undefined reference to `__aeabi_uidiv' 

违规代码如下所示:

 U0DLL = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF <> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) % 256; U0DLM = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF <> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) / 256; 

我已经四处寻找,这可能是由AFAICT引起的,而不是使用LD的lgcc和lc选项。 我已经解决了这个问题,但仍然存在错误。

完整的项目可以在我的github仓库找到 。

如果有人能提供帮助,那将会受到极大的欢迎。 干杯。

ARM系列CPU没有本机整数除法指令。 因此,需要通过库函数来实现除法。 GCC知道这一点,并创建一个引用(在你的例子中) __aeabi_uidiv (对于unsigned int division)。

您需要链接包含此function的相应运行时支持库。

听起来像是一个工具链问题 – 也许你的gcc是为ARM EABI构建的,但你的库(libgcc?)是为传统的ABI构建的?

我遇到了这个问题并通过在Makefile传递libgcc.a的正确位置来解决它。 您可能需要添加:

 "-L*path_to_libgcc.a* -lgcc" 

到LDFLAGS

我通常避免分歧,当我必须使用一个,有时我遇到了这个问题。 这些除法函数的(汇编程序)源代码位于gcc源代码中,并不太难以提取该代码,只是在gcc不合作时将其链接起来。 一旦你有一个删除宏的版本,一个干净的源,你可以把它带到你的后袋。 谷歌搜索我曾经发现建议是使用非linux eabi,但是你发现它并不总是有效,有时但并非总是如此。

检查您的libgcc.a是否位于codesourcery目录中。 我在TI初学者软件中遇到了同样的问题,它修复了其中一个makefile中libgcc.a的路径。