Hallo,
da Java auf meinem P100-Laptop nicht benutzbar ist, habe ich im Urlaub angefangen mich mit C zu beschäftigen. Natürlich geht erst mal nichts:
pummel@k7:~/cprog/mysql > gcc -Wall -I/usr/local/mysql/include/mysql first_db.c -o first_db.o /tmp/ccengm7I.o: In function `main': /tmp/ccengm7I.o(.text+0xc): undefined reference to `mysql_init' /tmp/ccengm7I.o(.text+0x34): undefined reference to `mysql_real_connect' /tmp/ccengm7I.o(.text+0x6d): undefined reference to `mysql_close' /tmp/ccengm7I.o: In function `dbInsert': /tmp/ccengm7I.o(.text+0x93): undefined reference to `mysql_query' /tmp/ccengm7I.o: In function `dbSelect': /tmp/ccengm7I.o(.text+0xd3): undefined reference to `mysql_query' /tmp/ccengm7I.o(.text+0xfd): undefined reference to `mysql_store_result' /tmp/ccengm7I.o(.text+0x12c): undefined reference to `mysql_num_fields' /tmp/ccengm7I.o(.text+0x140): undefined reference to `mysql_fetch_row' /tmp/ccengm7I.o(.text+0x15f): undefined reference to `mysql_fetch_lengths' /tmp/ccengm7I.o(.text+0x1ed): undefined reference to `mysql_free_result' collect2: ld returned 1 exit status
Das Progrämmchen sieht ungefähr so aus (auch geklaut): 4 #include <stdio.h> 5 #include <mysql.h> 11 int main() 12 { 13 MYSQL * dbHandle; 14 15 dbHandle = mysql_init(0); 16 dbHandle = mysql_real_connect(dbHandle, 17 "localhost", /* on what host */ 18 "pummel", /* the user */ 19 0, /* no password */ 20 "immonet", /* the database */ 21 0, /* don't change the port number */ 22 0, /* don't change the UNIX socket */ 23 0); /* client flag */ 24 if (dbHandle==0) { 25 puts("no connect to database"); 26 } 29 dbSelect(dbHandle); 32 mysql_close(dbHandle); 34 return 0; 35 } 36 45 void dbSelect(MYSQL *dbHandle) 46 {...} xx return 1;
Der Fehler erscheint mir als der, dass de Compiler die in mysql.h definierten Funktionen nicht findet. Was muss ich ihm noch mit auf den Weg geben, das er es tut?
Mit freundlichen Grüßen
Jens Puruckherr
Hi Jens,
On Tue, Jun 04, 2002 at 15:33:25 +0200, Jens Puruckherr wrote:
pummel@k7:~/cprog/mysql > gcc -Wall -I/usr/local/mysql/include/mysql first_db.c -o first_db.o /tmp/ccengm7I.o: In function `main': /tmp/ccengm7I.o(.text+0xc): undefined reference to `mysql_init'
Nur Headerdateien einbinden reicht bei C nicht, Du musst auch die zugehoerige Library explizit dazulinken:
gcc [...] -lmysql
(wenn die Library "libmysql.so" heisst)
bye, Chris
Hallo Christian,
Nur Headerdateien einbinden reicht bei C nicht, Du musst auch die zugehoerige Library explizit dazulinken:
gcc [...] -lmysql
(wenn die Library "libmysql.so" heisst)
Ich habe mir eben noch mal die Doku zur C-Api von mysql reingezogen, die reden aber nur über ein Makefile. Soweit bin ich noch nicht. Alle verwendeten Funktionen stecken in der 'libmysqlclient', das ist schon mal sicher. Da habe ich nun eine Version mit Quelltext im src-Verzeichnis und eine binary im Installverzeichnis. Der Linker findet nix, egal, wie ich den '-l'- Parameter aufrufe. pummel@k7:~/cprog/mysql > gcc -Wall -I/usr/local/mysql/include/ -llibmysqld first_db.c -o first_db.o /usr/i486-suse-linux/bin/ld: cannot find -llibmysqld collect2: ld returned 1 exit status [ 999 andere Versuche ...] pummel@k7:~/cprog/mysql > gcc -Wall -I/usr/local/mysql/include/ -lmysqlclient first_db.c -o first_db.o /usr/i486-suse-linux/bin/ld: cannot find -lmysqlclient collect2: ld returned 1 exit status
Mit freundlichen Grüßen
Jens Puruckherr
On Tue, Jun 04, 2002 at 04:29:46PM +0200, Jens Puruckherr wrote:
Hallo Christian,
Nur Headerdateien einbinden reicht bei C nicht, Du musst auch die zugehoerige Library explizit dazulinken:
gcc [...] -lmysql
(wenn die Library "libmysql.so" heisst)
Ich habe mir eben noch mal die Doku zur C-Api von mysql reingezogen, die reden aber nur über ein Makefile. Soweit bin ich noch nicht.
Makefile: ,-------- |# erstes triviales Makefile |# die weiten Einrückungen sind TABS!!! |CFLAGS = -I/usr/local/mysql/include |LDFLAGS = -L/usr/local/mysql/lib -lmysqlclient | |first_db: | |clean: | -rm -f first_db first_db.o core `------------
Angenommen, die Library ist als file libmysqlclient.so vorhanden. ~~~ (ist oben kein(!) Schreibfehler, daß das lib fehlt!
-I der Pfad zu weiteren Include-Verzeichnissen -L der Pfad zu weiteren Library-Verzeichnissen
Und jetzt geht:
make # für eben Dein Projekt make clean # zum Aufräumen
Natürlich geht alles noch viel cleverer und cooler, aber darum geht's ja beim *ersten* Makefile noch nicht.
Heiko
Hallo Heiko,
Am Dienstag, 4. Juni 2002 19:44 schrieb Heiko Schlittermann:
Makefile:
[...Beschreibung...]
Natürlich geht alles noch viel cleverer und cooler, aber darum geht's ja beim *ersten* Makefile noch nicht.
Danke für die Schnelleinführung. Spart einem das lästige Eintippen in der Shell am nächsten Morgen (nicht wirklich, ich habe die mühsam zusammenklamüserten Parameter in einer .txt-Datei abgelegt). Ich glaube mich dran zu erinnern, in irgendeinem Linux-Mag mal eine Einführung über make gelesen zu haben. Die such ich mir heute abend mal raus.
Mit freundlichen Grüßen
Jens Puruckherr
Hallo Christian,
Am Dienstag, 4. Juni 2002 16:51 schrieb Christian Perle:
Nur Headerdateien einbinden reicht bei C nicht, Du musst auch die zugehoerige Library explizit dazulinken:
gcc [...] -lmysql
(wenn die Library "libmysql.so" heisst)
Hach, ich bracu wohl erst mal den Doku: wie baue ich ein C-Programm. Meine C-Bücher schweigen sich über Compiler dezent aus, ich mopse mir alles irgendwo zusammen....
So, ich habe:
pummel@k7:/usr/local/mysql/lib/mysql > ll insgesamt 981 -rw-r--r-- 1 mysql mysql 11822 Apr 16 13:30 libdbug.a -rw-r--r-- 1 mysql mysql 34762 Apr 16 13:30 libheap.a -rw-r--r-- 1 mysql mysql 15254 Apr 16 13:30 libmerge.a -rw-r--r-- 1 mysql mysql 231430 Apr 16 13:30 libmyisam.a -rw-r--r-- 1 mysql mysql 23046 Apr 16 13:30 libmyisammrg.a -rw-r--r-- 1 mysql mysql 193158 Apr 16 13:30 libmysqlclient.a -rwxr-xr-x 1 mysql mysql 721 Apr 16 13:30 libmysqlclient.la lrwxrwxrwx 1 mysql mysql 24 Apr 16 13:30 libmysqlclient.so -> libmysqlclient.so.10.0.0 lrwxrwxrwx 1 mysql mysql 24 Apr 16 13:30 libmysqlclient.so.10 -> libmysqlclient.so.10.0.0 -rwxr-xr-x 1 mysql mysql 141729 Apr 16 13:30 libmysqlclient.so.10.0.0 -rw-r--r-- 1 mysql mysql 31496 Apr 16 13:30 libmystrings.a -rw-r--r-- 1 mysql mysql 199108 Apr 16 13:30 libmysys.a -rw-r--r-- 1 mysql mysql 102188 Apr 16 13:30 libnisam.a
Es ist wohl die libmysqlclient.so also heisst es dann:
... -lmysqlclient ... ??? Wie kommt man eigenlich vom Dateinamen auf den abgespeckten Namen der Lib?
Mit freundlichen Grüßen
Jens Puruckherr
Hallo nochmal,
Am Dienstag, 4. Juni 2002 16:51 schrieb Christian Perle:
Nur Headerdateien einbinden reicht bei C nicht, Du musst auch die zugehoerige Library explizit dazulinken:
gcc [...] -lmysql
(wenn die Library "libmysql.so" heisst)
gcc -Wall -I/usr/local/mysql/include/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient first_db.c -o first_db.o
kompiliert. So, nun Achtung Start....
pummel@k7:~/cprog/mysql > ./first_db.o ./first_db.o: error in loading shared libraries: libmysqlclient.so.10: cannot open shared object file: No such file or directory
Buääähhh!!! Libpfad?...Libpfad!...einstellen gehen....wo noch mal...?
Mit freundlichen Grüßen
Jens Puruckherr
Hi Jens,
On Tue, Jun 04, 2002 at 16:40:11 +0200, Jens Puruckherr wrote:
gcc -Wall -I/usr/local/mysql/include/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient first_db.c -o first_db.o kompiliert. So, nun Achtung Start....
pummel@k7:~/cprog/mysql > ./first_db.o ./first_db.o: error in loading shared libraries: libmysqlclient.so.10: cannot open shared object file: No such file or directory
Der dynamische Linker findet nur shared libraries, die in den Verzeichnissen /lib, /usr/lib und den in /etc/ld.so.conf aufgelisteten Verzeichnissen stehen. Also /usr/local/mysql/lib/mysql in /etc/ld.so.conf eintragen und ldconfig -v laufen lassen.
Statt dessen kannst Du auch in der Shell, aus der Du Dein Programm starten willst, vorher export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql setzen. Auch das wird vom dynamischen Linker beachtet.
bye, Chris
On Tue, 04 Jun 2002 17:58:54 +0200, Christian Perle wrote:
Der dynamische Linker findet nur shared libraries, die in den Verzeichnissen /lib, /usr/lib und den in /etc/ld.so.conf aufgelisteten Verzeichnissen stehen. Also /usr/local/mysql/lib/mysql in /etc/ld.so.conf eintragen und ldconfig -v laufen lassen.
Statt dessen kannst Du auch in der Shell, aus der Du Dein Programm starten willst, vorher export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql setzen. Auch das wird vom dynamischen Linker beachtet.
Oder man gibt beim Linken noch das Flag -R/usr/local/mysql/lib/mysql an. Ich mag $LD_LIBRARY_PATH jedenfalls nicht :-)
Reinhard
Hi Reinhard,
On Tue, Jun 04, 2002 at 18:25:57 +0200, Reinhard Foerster wrote:
Oder man gibt beim Linken noch das Flag -R/usr/local/mysql/lib/mysql an.
Das ist die Moeglichkeit, die ich vergessen habe :)
bye, Chris
lug-dd@mailman.schlittermann.de