我的情况非常奇怪。每当我尝试编译我的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)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) % 256;
U0DLM = ((((PLLCFG & 0x7FFF) + 1) * F_OSC) / ((((PLLCFG & (0xFF << 16)) >> 16) + 1) * ((CCLKCFG & 0xFF) + 1) * 8 * BAUD * 1)) / 256;
我已经四处寻找,这可能是由AFAICT导致的,而不是使用lgcc&amp; LD的lc选项。我已经解决了这个问题,但仍然存在错误。
完整项目可以是found at my github repo。
如果有人能提供帮助,那将会受到极大的欢迎。欢呼声。
答案 0 :(得分:10)
ARM系列CPU没有本机整数除法指令。因此,需要通过库函数来实现除法。 GCC知道这一点,并创建(在您的情况下)__aeabi_uidiv
(unsigned int
分裂)的引用。
您需要链接包含此功能的相应运行时支持库。
答案 1 :(得分:2)
听起来像工具链问题 - 也许你的gcc是为ARM EABI构建的,但你的库(libgcc?)是为传统的ABI构建的?
答案 2 :(得分:2)
我遇到了这个问题,并通过在libgcc.a
中传递Makefile
的正确位置来解决此问题。您可能需要添加:
"-L*path_to_libgcc.a* -lgcc"
到LDFLAGS
答案 3 :(得分:0)
我通常避免分歧,当我必须使用一个时,有时我会遇到这个问题。这些除法函数的(汇编程序)源代码位于gcc源代码中,并不太难以提取该代码,只是在gcc不合作时将其链接起来。一旦你有一个删除了宏的版本等,一个干净的源,你可以把它放在你的后袋里。谷歌搜索我曾经发现,建议是使用非Linux eabi,但你发现它并不总是有效,有时但并非总是如此。
答案 4 :(得分:0)
检查您的libgcc.a是否位于codesourcery目录中。我在TI初学者软件中遇到了同样的问题,它在其中一个makefile中修复了libgcc.a的路径。