Fehler in C-Makro

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Fehler in C-Makro

Beitrag von klaus » 01.12.2004 15:25:45

Moin,

ich benoetige fuer die Statistik-Software R einige Makros,
teilweise funktionieren sie auch. Die Makros sind normale C-Shared-Libraries,
ich habe sie mit

gcc -c -fPIC -I/usr/include/mysql/ bestInfektTage.c
gcc -shared -o libbestInf.so bestInfektTage.o

compiliert. Es gab auch kein Fehler während des Kompilierens.

Nun habe ich ein Makro erstellt, welches auf eine Datenbank zuhreifen soll und
in R gibt es beim Laden des Makros folgenden Fehler

> dyn.load("/home/henzef/r_Programme/libbestInf.so",local=TRUE, now=TRUE)
Error in dyn.load(x, as.logical(local), as.logical(now)) :
unable to load shared library "/home/henzef/r_Programme/libbestInf.so":
/home/henzef/r_Programme/libbestInf.so: undefined symbol: mysql_fetch_row
>


Es wird die Funktion mysql_fetch_row nicht erkannt,
allerdings werden andere Funktionen wie z.B. mysql_use_result
erkannt. WARUM?

Bei Bedarf kann ich auch noch den C-Code zeigen.

Danke
Matthias

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.12.2004 15:51:23

Hi,

so kannst du fehlende funktionen oder daten objekte herausfinden

Code: Alles auswählen

ldd -r /home/henzef/r_Programme/libbestInf.so
[/code]

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.12.2004 15:57:02

es ist mir allerdings auch noch aufgefallen, daß du keine libraries beim linken angibst

mysql_use_result könnte ein C macro oder eine inline function sein und braucht dann keine library

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 01.12.2004 16:23:13

Moin,

vielen Dank fuer die schnelle Antwort,

was heist libraries angeben beim linken und wie geht das.

ENTSCHULDIGUNG, sicher eine dumme Frage.

Danke Matthias

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.12.2004 16:35:00

nun diese funktion "mysql_fetch_row" ist höchst wahrscheinlich in irgend einer library (shared library) enthalten, so wie dein "makro" in deiner libbestInf.so, wenn der loader aber nicht weis in welcher, bricht er den ladevorgang mit so einer fehlermeldung ab.

diese information die der loader benötigt, wird beim linken in das modul eingetragen, sofern dies information dem linker bekannt ist.

damit der linker weis, welche libraries er nach dieser funktion durchsuchen soll, mußt du die entsprechenden libraries beim linken ( also bei gcc -shared -o libbestInf.so bestInfektTage.o) angeben.

ich habe zwar sehr viel mit datenbank programmierung zu tun, aber leider nur mit properitären (db2,oracle, sqlserver,...), daher habe ich leider auch keine ahnung welche libraries du dazu linken mußt

klaus
Beiträge: 102
Registriert: 09.06.2003 11:32:10

Beitrag von klaus » 01.12.2004 16:51:09

Moin nochma,

wieder tausend Dank fuer die schnelle Antwort,

Mit
gcc -c -fPIC -I/usr/include/mysql/ bestInfektTage.c
gcc -shared -o libbestInf.so bestInfektTage.o -L/usr/lib/mysql -lmysqlclient

hat es nun funktioniert.
ENTSCHULDIGE nocheinmal,
haette man auch durch lesen herausbekommen koennen.


Vielen Tausend DANK,
Matthias

Antworten