我设计了一个用于我的 AVR 项目的静态库,但我无法将它链接到应用程序。它报告此错误:
libteleobjects/libteleobjects.a(telesignals.c.obj): In function `telesignal_get_event_data':
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:559: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
我在这里发现了对同一问题的有趣调查,但由于他的解决方案都是关于 ADA 我不知道如何在我的案例中解决它,这是一个C
应用程序。不过它给了我很好的提示,比如使用avr-nm
在系统库中搜索这个符号。与他的情况不同,这里的符号即使在应该找到它的 avr 系统库中也__mulhi3
显示为(未定义)(对于他来自 AVR-GCC 4.7.2 的库 - 我的是 4.8.0),所以我猜是根本没有定义(!?)。我希望它应该在系统库(/usr/avr/lib 和子目录中的文件)中显示为(在该部分中定义)。有小费吗?作为旁注,我使用 CMake 作为构建系统。U
libgcc.a
__mulhi3
T
text
.a
编辑:
就像这里和下面的答案中建议的那样,将数学库添加到链接的末尾应该可以解决问题,但是 CMake 已经在这样做了,但它还没有工作:
Linking C executable ucp-usc64.elf
/usr/bin/cmake -E cmake_link_script CMakeFiles/ucp-usc64.dir/link.txt --verbose=1
/usr/bin/avr-gcc -g -Os -mcall-prologues -ffunction-sections -fdata-sections -Os -DNDEBUG -w -mcall-prologues -ffunction-sections -fdata-sections -Wl,--gc-sections -lm -Wl,--gc-sections -lm -mmcu=atmega644p CMakeFiles/ucp-usc64.dir/main.c.obj CMakeFiles/ucp-usc64.dir/modutr_callbacks.c.obj -o ucp-usc64.elf -lc -lm avr-drivers/libavr_drivers.a modutr-slave/lib/libmodutr_slave.a libteleobjects/libteleobjects.a -lc -lm
libteleobjects/libteleobjects.a(telesignals.c.obj): In function `telesignal_get_event_data':
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:559: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
/home/claudio/git/ucp-usc64/libteleobjects/telesignals.c:561: undefined reference to `__mulhi3'
collect2: error: ld returned 1 exit status