0

次のエラーが表示されます。最後の行に基づいて、リンカーエラーだと思います。しかし、私は私が何について話しているのか本当にわかりません。:) 私は初心者です。他にもおかしな点があれば教えてください!

エラー: AttachHandler(_CPhidget*, void*)' error: undefined reference toDetachHandler(_CPhidg​​et*, void*) への未定義の参照' エラー: ErrorHandler(_CPhidget*, void*, int, char const*)' error: undefined reference toData(_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で CPhidg​​et_Set_OnAttach_Handler() のパラメータとして AttachHandler などを渡そうとしています:

#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();
}

助けてくれてありがとう!

4

1 に答える 1

1

の宣言があることがわかります。

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

コンパイラは、宣言された関数を呼び出すソースコードをコンパイルできます。ただし、リンクステップでは、リンカーはこれらの関数の定義を見つけて出力ファイルに含めることができません-コンパイラーが渡したファイルにそれらが見つからないためです。サードパーティのライブラリを使用しているため、これらの関数は「ライブラリ ファイル」にプリコンパイルされており、リンク手順に含める必要があります。

Visual Studio を使用している場合は、プロジェクトを右クリックしてプロパティを開きます。内Linker-> Input->Additional Dependencies欠落している定義を含む lib ファイルの名前を追加します (phidget21.libと仮定します)。また、リンカーのライブラリ パスにそのファイルを含むフォルダーが含まれていることを確認してください (タブの下のプロパティ ページで設定できVC++ Directoriesます)。

于 2013-02-14T17:10:30.153 に答える