11 Stimmen

Undefinierter Verweis bei Verwendung von ncurses auf Linux

Ich versuche, ein Programm unter Linux mit ncurses zu entwickeln. Ich kann nicht einmal das "Hallo Welt"-Beispiel kompilieren. Hier ist der Code:

#include 

int main()
{         
        initscr();
        printw("Hallo, Welt.");
        refresh();
        getch();
        endwin();
        return 0;
}

Beim Versuch zu kompilieren, erhalte ich:

hello.c:(.text+0x12): undefined reference to `initscr'

Für jeden dieser aufgerufenen Funktionen.

Ich habe ncurses über apt-get installiert, sowie durch Herunterladen der Quellen und Kompilieren, Installieren, etc.

Ich habe sowohl curses.h als auch ncurses.h mit #include ausprobiert.

Was ist hier los?

16voto

Greg Hewgill Punkte 882617

Haben Sie die Option -lcurses beim Verlinken verwendet?

Das Einbeziehen der Header-Dateien lässt den Code kompilieren (da der Compiler weiß, wie der Funktionsaufruf aus der .h Datei aussieht), aber der Linker benötigt die Bibliotheksdatei, um den tatsächlichen Code zu finden, der in Ihr Programm verlinkt werden soll.

14voto

Brian Campbell Punkte 304982

Wie Greg Hewgill sagte, müssen Sie -lcurses oder -lncurses übergeben, um die curses-Bibliothek zu verlinken.

gcc -o hello hello.c -lncurses

Sie meinen wahrscheinlich auch initscr() und getch() zu verwenden. Nachdem ich diese Ersetzungen vorgenommen habe, kompiliert das oben genannte für mich.

9voto

Kyle Falconer Punkte 7926

Ich hatte ein ähnliches Problem und fand eine Lösung, die mir geholfen hat, aber leicht von den anderen hier geposteten Antworten abwich. Ich versuchte, die Panels-Bibliothek mit curses zu verwenden und mein Kompilierungsbefehl war:

$ gcc -o hello hello.c -lncurses -lpanel

Als ich die anderen Antworten las, war ich verwirrt, weil ich den -lncurses-Flag bereits inkludierte, aber es hat immer noch nicht kompiliert, und mit ähnlichen Fehlern wie die, die du bekommen hast:

$ gcc -o hello hello.c -lncurses -lpanel
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In Funktion `new_panel':
p_new.c:(.text+0x18): undefinierter Verweis auf "_nc_panelhook"

Schließlich fand ich meine Antwort in der tldp:

"Um die Panels-Bibliotheksfunktionen zu verwenden, müssen Sie panel.h einfügen und das Programm mit der Panels-Bibliothek mit dem Flag -lpanel in dieser Reihenfolge zusammen mit -lncurses verlinken."

Es scheint also, dass die Reihenfolge wichtig ist, wenn man die Kompilierungsflags verwendet! Ich versuchte die Reihenfolge zu ändern:

gcc -o hello hello.c -lpanel -lncurses

Dies ermöglichte es, erfolgreich zu kompilieren. Ich weiß, dass du bereits deine Antwort hast, also hoffe ich, dass dies jemandem hilft.

4voto

Tarnay Kálmán Punkte 6772

Für alle, die ähnliche Probleme haben: -lx Argumente, wobei x Ihre Bibliothek ist, sollten immer den Quell- und Objektdateien folgen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X