问题描述
我试图使用在一个项目中,使用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编译器/连接未定义引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!