PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linker erkennt Funktion in Library nicht



tommy@linux
22-09-2005, 06:50
Hi,

ich habe ein seltsames problem.
Verwende den Header einer compilierten Datei um auf Funktionen dieser Library zuzugreifen.
Wenn ich mein Programm starte bringt er ": undefined reference to ..." fuer alle Funktionen aus dem Header. Die Library findet er, da wenn sie nicht da ist, er die Fehlermeldung dafuer bringt.

THX 4 HELP

peschmae
22-09-2005, 09:13
Und wir sollen jetzt raten was du genau machst? Ich vermute mal du linkst gar nicht gegen die Bibliothek.

MfG Peschmä

tommy@linux
23-09-2005, 04:34
Header



/*--------------------------------------------------------------------------*/
// fglove.h
//
// 5DT Data Glove driver SDK
// Version 1.02
//
// Copyright (C) 2000, 5DT <Fifth Dimension Technologies>
// http://www.5dt.com/
/*--------------------------------------------------------------------------*/
#ifndef _FGLOVE_H_
#define _FGLOVE_H_
/*--------------------------------------------------------------------------*/
enum EfdGloveHand
{
FD_HAND_LEFT, // left-handed glove
FD_HAND_RIGHT // right-handed glove
};

enum EfdGloveTypes
{
FD_GLOVENONE, // no glove
FD_GLOVE7, // 7-sensor
FD_GLOVE7W, // 7-sensor, wireless
FD_GLOVE16, // 16-sensor
FD_GLOVE16W // 16-sensor, wireless
};

enum EfdSensors
{
FD_THUMBNEAR=0,
FD_THUMBFAR,
FD_THUMBINDEX,
FD_INDEXNEAR,
FD_INDEXFAR,
FD_INDEXMIDDLE,
FD_MIDDLENEAR,
FD_MIDDLEFAR,
FD_MIDDLERING,
FD_RINGNEAR,
FD_RINGFAR,
FD_RINGLITTLE,
FD_LITTLENEAR,
FD_LITTLEFAR,
FD_THUMBPALM,
FD_WRISTBEND,
FD_PITCH,
FD_ROLL
};
/*--------------------------------------------------------------------------*/
typedef struct
{
// The contents of this struct are platform-dependent and subject to
// change. You should not manipulate the contents of this struct directly.
void *m_pStuff;
} fdGlove;
/*--------------------------------------------------------------------------*/
fdGlove *fdOpen(char *pPort);
int fdClose(fdGlove *pFG);
int fdGetGloveHand(fdGlove *pFG);
int fdGetGloveType(fdGlove *pFG);
int fdGetNumSensors(fdGlove *pFG);
void fdGetSensorRawAll(fdGlove *pFG, unsigned short *pData);
unsigned short fdGetSensorRaw(fdGlove *pFG, int nSensor);
void fdSetSensorRawAll(fdGlove *pFG, unsigned short *pData);
void fdSetSensorRaw(fdGlove *pFG, int nSensor, unsigned short nRaw);
void fdGetSensorScaledAll(fdGlove *pFG, float *pData);
float fdGetSensorScaled(fdGlove *pFG, int nSensor);
int fdGetNumGestures(fdGlove *pFG);
int fdGetGesture(fdGlove *pFG);
void fdGetCalibrationAll(fdGlove *pFG, unsigned short *pUpper, unsigned short *pLower);
void fdGetCalibration(fdGlove *pFG, int nSensor, unsigned short *pUpper, unsigned short *pLower);
void fdSetCalibrationAll(fdGlove *pFG, unsigned short *pUpper, unsigned short *pLower);
void fdSetCalibration(fdGlove *pFG, int nSensor, unsigned short nUpper, unsigned short nLower);
void fdResetCalibration(fdGlove *pFG);
void fdGetSensorMaxAll(fdGlove *pFG, float *pMax);
float fdGetSensorMax(fdGlove *pFG, int nSensor);
void fdSetSensorMaxAll(fdGlove *pFG, float *pMax);
void fdSetSensorMax(fdGlove *pFG, int nSensor, float fMax);
void fdGetThresholdAll(fdGlove *pFG, float *pUpper, float *pLower);
void fdGetThreshold(fdGlove *pFG, int nSensor, float *pUpper, float *pLower);
void fdSetThresholdAll(fdGlove *pFG, float *pUpper, float *pLower);
void fdSetThreshold(fdGlove *pFG, int nSensor, float fUpper, float fLower);
void fdGetGloveInfo(fdGlove *pFG, unsigned char *pData);
void fdGetDriverInfo(fdGlove *pFG, unsigned char *pData);
/*--------------------------------------------------------------------------*/
#endif // #ifndef _FGLOVE_H_
/*--------------------------------------------------------------------------*/


und Makefile



#
# makefile for testglove, a simple console app to demonstrate reading the
# glove
#
# Copyright (C) 2000, 5DT <Fifth Dimension Technologies>
#

CPP = g++
CFLAGS = -Wall
BIN = testglove
LIBS = -lfglove
OBJFILES = testglove.o

default: $(OBJFILES)
$(CPP) -o $(BIN) $(OBJFILES) $(LIBS)

clean:
rm -f $(BIN) $(OBJFILES) *~ core #*

%.o: %.cpp
$(CPP) $(CFLAGS) -c $< -o $@


Header ist im akutellen Verzeichnis, Library habe ich probiert in MEIN_LIB_DIR, /usr/local/lib, /usr/lib.
Die Library findet er aber nicht die Funktionen in der Library...

SeeksTheMoon
23-09-2005, 10:16
kannst Du es auch nicht manuell machen?
g++ -I. -L. -lfglove meinprog.c
Wenn das nicht geht, dann sind die fertigen Kompilate vielleicht nicht binärkompatibel zu dem was Dein Compiler produziert, bzw was der Linker erwartet.
Könnte an einer unterschiedlichen gcc-Version liegen in der es ein ABI-Change gab.

bmann
23-09-2005, 11:12
Hi
sehe ich das richtig, die Bibliothek ist eine C Bibliothek?
Du verwendest C++ und diese Bibliothek hat offenbar keinen C++ Support eingebaut.

Wenn du

#include "fglove.h"
in deinem Programm verwendest, versuch stattdessen mal

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

CU
Andi

tommy@linux
28-09-2005, 07:04
ich hatte ales probiert, und die Loesung ist.... Die .so war eine falsche library. Habe vom Support von 5DT eine neue bekommen und siehe da es funktioniert.

Echt toll wie man sich manchmal heiss macht und es is mal nicht das eigene problem

Trotzdem danke fuer eure Hilfe ;)