本文介绍了以功能链接avrfix库使用AVR-GCC编译器/连接未定义引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用在一个项目中,使用Eclipse(v4.2.2)作为IDE和AVR-GCC作为编译器。无论是头文件(avrfix.h)和库文件(libavrfix.a)都包含在同一个目录中,这是该项目的搜索路径,以及链接程序的库搜索路径。编译时,我得到了以下错误:

  D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:359:未定义的引用`lsincoslk(很久很久*)'
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:360:未定义的引用`lsincoslk(很久很久*)'
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:361:未定义的引用`lmullkD(很久很久)
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:362:未定义的引用`lmullkD(很久很久)
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:365:未定义的引用`lmullkD(很久很久)
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:365:未定义的引用`lmullkD(很久很久)
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:365:未定义的引用`lmullkD(很久很久)
./HMC5883/HMC5883.o:D:\\Documents\\Arduino\\IMU_Kalman\\Release/../HMC5883/HMC5883.cpp:367:为`lmullkD(很久很久)更未定义引用'跟随
./HMC5883/HMC5883.o:在功能`HMC5883 :: Calc_Heading(很久很久):
D:\\文档\\ Arduino的\\ IMU_Kalman \\发布/../ HMC5883 / HMC5883.cpp:369:未定义的引用`latan2lk(很久很久)
使:*** [IMU_Kalman.elf]错误1

我明白,这意味着连接不正确查找和连接问题的功能(lsincoslk,lmullkD,latan2lk)。这些功能应该位于avrfix库。是完整的,是这里所用的连接器调用:

  AVR-GCC -Os轮候册, -  GC-部分轮候册,-Map,IMU_Kalman.map -  CREF --export-全符号-L D:\\文档\\ Arduino的\\ IMU_Kalman \\ avrfix-LD:\\文档\\ Arduino的\\ IMU_Kalman \\ Board_Support_Library-mmcu = ATMEGA328P -oIMU_Kalman.elf./Wire/Wire.o ./Wire/twi.o ./SPI/SPI.o ./MPU6000/MPU6000.o ./Kalman_Filters/GyroKalman.o ./HMC5883/HMC5883.o ./GlobalVariables.o ./IMU_Kalman.o -lavrfix -lArduino_Duemilanove_w__ATmega328 -lm

这里的重要部分是包括所述-lavrfix命令。我知道链接器能够找到库,因为如果我尝试拼写错误avrfix,它给它找不到库是错误的,而不是上面提到的那些。还值得一提的是,我包括libArduino_Duemilanove_w__ATmega328.a库成功地,使用的是什么,我认为是同样的方法。

当我看看编译器生成的.map文件,我看到几个功能,这来自Arduino_Duemilanove_w__ATmega328库,符合市场预期(的malloc,例如)。然而,没有从avrfix库函数或物体似乎已经使它成为地图。搜索avrfix在.MAP文件的产量在那里提到只有一个行:

  LOAD D:\\文档\\ Arduino的\\ IMU_Kalman \\ avrfix \\ libavrfix.a

是否有可能有一个与链接顺序有问题?我在什么可能是错在这里会出现亏损。是avrfix库我使用了某些原因AVR-gcc编译器不兼容?我也有点不熟悉二进制解析器(或如果他们甚至有什么与我的问题做的),但我已经尝试在C中选择多个不同的解析器(包括GNU精灵分析器)/ C ++建设 - >设置 - >二进制解析器选项卡中的项目属性。欲了解更多信息,我有整个项目(尽管这是一项正在进行的工作,在早期阶段)在github 这里。我试着寻找其他线程的帮助,但似乎无法找到特定于我的应用程序avrfix库的信息。在一个其他线程,我发现了一个建议使用连接器的召唤--export-全符号选项,但似乎并没有帮助我的情况。

如果有人知道发生了什么事请帮帮忙!不要犹豫,向我索取更多信息。

问候,


解决方案

This is a reference to C++ mangled name.

It is likely that the libavrfix.a defines that symbol as undecorated C name. You can verify this by running

avr-readelf -Ws libavrfix.a | grep lsincoslk

If you see NNNN T _Z9lsincoslklPl, my guess is incorrect. But if you see NNNN T lsincoslk, then my guess is correct.

Looking at this version of avrfix.h, I see that it lacks proper extern "C" guards. When you include this header into C++, you must do this:

extern "C" {
#include "avrfix.h"
}

You wouldn't have to do that if avrfix developers cared about C++. You can send them a patch to avrfix.h. The patch should add this at the beginning:

#ifdef __cplusplus
extern "C" {
#endif

and this at the end:

#ifdef __cplusplus
}
#endif

这篇关于以功能链接avrfix库使用AVR-GCC编译器/连接未定义引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 21:08