C ++ Phidg​​et事件处理程序未定义引用'链接器'

时间:2013-02-14 16:55:52

标签: c++ qt linker-errors undefined-reference

我收到以下错误。基于最后一行,我认为它是链接器错误。但是,我真的不知道我在说什么。 :)我是初学者。如果你碰巧发现任何其他蹩脚的点,请告诉我!

错误:未定义引用AttachHandler(_CPhidget*, void*)' error: undefined reference to DetachHandler(_CPhidg​​et *,void *)' 错误:对ErrorHandler(_CPhidget*, void*, int, char const*)' error: undefined reference to数据的未定义引用(_CPhidg​​etBridge *,void *,int,double)' :-1:错误:collect2:ld返回1退出状态

我有一个名为eventhandlers.h的头文件,其中包含:

#ifndef EVENTHANDLERS_H
#define EVENTHANDLERS_H

#include <phidget21.h>


int CCONV AttachHandler(CPhidgetHandle SENSOR, void *userptr);
int CCONV DetachHandler(CPhidgetHandle SENSOR, void *userptr);
int CCONV ErrorHandler(CPhidgetHandle SENSOR, void *userptr, int ErrorCode, const char *DESCR);
int CCONV Data(CPhidgetBridgeHandle SENSOR, void *userptr, int index, double val);


#endif // EVENTHANDLERS_H

我试图在源文件名quadbridge.cpp PARTIAL CODE 中传递AttachHandler和其他作为CPhidg​​et_Set_OnAttach_Handler()的参数:

#include "stdlib.h"
#include "quadbridge.h"
#include "eventhandlers.h"

QuadBridge::QuadBridge(int numOfSensors, int PhidgetID)
{

this->SERIAL = 140800;
//this->SERIAL = 137723;

this->bridge = 0;
CPhidgetBridge_create(&bridge);
setEventHandlers();

if(setAttachController(PhidgetID))
{
    getNumOfSensorsAttached(numOfSensors);
    initSensors();
}
else
{
    exit(1);
}

}

QuadBridge::~QuadBridge()
{
CPhidget_close((CPhidgetHandle)bridge);
CPhidget_delete((CPhidgetHandle)bridge);
}

void QuadBridge::setEventHandlers()
{
CPhidget_set_OnAttach_Handler((CPhidgetHandle)bridge, AttachHandler, 0);
CPhidget_set_OnDetach_Handler((CPhidgetHandle)bridge, DetachHandler, 0);
CPhidget_set_OnError_Handler((CPhidgetHandle)bridge, ErrorHandler, 0);

CPhidgetBridge_set_OnBridgeData_Handler(bridge, Data, 0);

CPhidget_open((CPhidgetHandle)bridge, SERIAL);
}

最后 - 我让整个事情在主要方面滚动。

#include "palmtools.h"
#include "QuadBridge.h"
#include <QApplication>

QuadBridge *qb;

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PalmTools w;
w.show();

qb = new QuadBridge(4);

return a.exec();
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你可以看到有

的声明
int CCONV AttachHandler(CPhidgetHandle SENSOR, void *userptr); //etc

和编译器可以编译调用声明函数的源代码。但是,在链接步骤中,链接器无法找到这些函数的定义以将它们包含到输出文件中 - 因为在编译器已传递给它的文件中找不到它们。由于您使用的是第三方库,因此这些函数预先编译在“库文件”中,您需要在链接步骤中包含这些函数。

如果您使用的是Visual Studio,请右键单击该项目并打开属性。在Linker - &gt;内Input - &gt; Additional Dependencies添加包含缺少定义的lib文件的名称(我假设为phidget21.lib)。另外,确保链接器的库路径包含该文件的文件夹(您可以在VC++ Directories选项卡下的属性页中设置它。)