Programmier(Kompilier-)problem in C unter Linux

Minime

Commander
Mitglied seit
11.11.2001
Beiträge
193
Renomée
0
Ich hab ein Problem unter SuSE 7.3 ein C-Queltext zu kompilieren.
Das „Programm“ sieht wie folgt aus:

#include <curses.h>

int main()
{
int c,x=1;

while(x)
{
initscr(); /*curses initialisieren*/
keypad(stdscr,TRUE);
while((c=getch()) == KEY_DOWN || c==KEY_UP || c==KEY_LEFT || c==KEY_RIGHT);
x=0;
}
endwin();
return 0;
}

Ich hab es aus einem Script kopiert. Es macht nicht viel, eigentlich gar nix, aber ich wollte hier nicht soviel Quelltext reinstellen und bei diesem Mini-Programm tritt das Problem genauso auf, wie bei den größeren.

ich kompiliere mit :
gcc –o bla bla.c

als Antwort bekomme ich:
/tmp/cclePC35.o: in function ‘main’
/tmp/cclePC35.o (.text+0x19): undefined reference to ’initscr’
/tmp/cclePC35.o (.text+0x20): undefined reference to 'XXXXX'
usw

Es werden alle Funktionen wie z.b. initscr aufgelistet, welche eigentlich in der curses.h stehen. Der Teil: cclePC35 ist bei jedem kompilier Durchlauf anders.
WAS MACH ICH FALSCH? bzw. was bedeutet das und was muß ich tun, damit es funktioniert?

MfG
Minime
 
Zuletzt bearbeitet:
Das Compilieren funktioniert, der Fehler kommt beim Linken, die angemeckerten Funktionen können nicht gefunden werden.
Das bedeutet, du musst die Bibliothek, welche den übersetzten Code von curses enthält, dazu linken.

Unter cygwin mit dem GNU-Compiler geht das so:
Allg.:
gcc -o exename exename.c -lnamelib

Beispiel:
gcc -o test test.c -llibcurses

Es wird compiliert und das erzeugte test object mit der libcurses zu nem executable namens test gelinkt. Die Option für das Hinzulinken ist -l direkt gefolgt von dem Library-Namen.

Ciao,
Ray
 
Hallo und THX erst mal.

Leider funktioniert das auch nicht.
Genauso wie
gcc -o programmname programmname.c -lncurses /*oder auch -lcurses*/

es kommt die Meldung:
/usr/i486-suse-linux/bin/ld: cannot find –llibcurses (oder –lncurses oder -lcurses)

Die curses.h hab ich im Verzeichnis /usr/lib gefunden. Muß ich irgendwo ein verweis auf dieses Verzeichnis setzten, damit das funktioniert?

MfG
Minime
 
Wenn dein "Setup" bzw. dein Environment (Umgebungsvariablen, Pfade etc.) stimmt, sollte der gcc eigentlich alles finden was er braucht.
Weiterhin muss eine Library nicht zwangsläufig so heissen wie ein scheinbar dazugehöriges Headerfile... Das musst du noch rausbekommen, wie die Lib bei dir nun heisst. Bei linux denk ich müsste die Lib unter \usr\lib\ zu finden sein. Such doch mal nach einer Lib, welche ?curses heisst.

Ich habe kein Linux am Laufen, aber die cygnus-tools unter Win2k. Damit habe ich eine GNU-Umgebung und das Commandline-Feeling von Linux. Ich konnte sofort mit
gcc -o test test.c -llibcurses das Programm erzeugen.
In meinem Fall liegt die LIB direkt unter dem Verzeichnis \lib\ als libncurses.a, das Include-File unter \usr\include.

Wahrscheinlich solltest du dir mal die entspr. HowTo's durchlesen oder in einem Linux-Forum nachfragen.
Ein Buch "C/C++ Programmierung unter Linux" wäre bestimmt auch nicht verkehrt.
Vielleicht findest du in deiner Installation auch Programmierbeispiele mit Make-Files, Batches u.s.w.

Ciao,
Ray
 
meine liegt im verzeichnis usr/lib/ und heißt, genau wie bei dir, libncurses.a. scheint wohl doch ein problem mit den umgebungsvariablen zu sein. werd mal schauen ob ich ein gutes linux forum finde (dürfte ja nicht zu schwer sein). die cygnus-tools werd ich mir auch mal antun (wenn mein freund wieder aus dem urlaub zurück ist, mit meinen analogen modem macht das bestimmt keinen sinn die packete runterzuladen).

mfg
Minime
 
Seltsam ???
Also die Library heißt libncurses.so oder .a, also muß der Linkerbefehl -lncurses heißen, nicht -llibncurses (immer das lib davor weg).
Es kann nur sein daß aus einem unerfindlichen Grunde /usr/lib bei dir nicht im library-Pfad ist, bind den mal manuell ein.
gcc -o test -L /usr/lib -lncurses test.c

cu, huraxprax
 
@huraxprax THX hat geholfen!
hab es mit pfadangabe compiliert und es hat funktioniert. linux hat sich das wohl "gemerkt", denn ich kann jetzt ohne die pfadangabe einfach mit gcc - o test test.c -lncurses compilieren.

thx nochmal an euch zwei

ein nun vorerst glücklicher
Minime
 
Übrigens, unter cygnus funktionierts mit
gcc -o test test.c -lcurses
sowie
gcc -o test test.c -llibcurses

Ciao,
Ray
 
Zurück
Oben Unten