2009-04-30 10 views
9

Ich versuche, ein Programm mit Ncurses unter Linux zu entwickeln. Ich kann nicht einmal das Hello World-Beispiel kompilieren. Hier ist der Code:Nicht definierte Referenz bei der Verwendung von Ncurses unter Linux

#include <curses.h> 

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

Wenn ich zu kompilieren versuchen, erhalte ich:

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

Für jede dieser genannten Funktionen.

Ich installierte ncurses über apt-get und auch durch die Quellen herunterzuladen und zu kompilieren, Installation etc.

Ich habe #include versucht, sowohl curses.h und ncurses.h.

Was ist los?

Antwort

12

Haben Sie die Option -lcurses beim Verknüpfen verwendet?

Einschließen der Header-Dateien lässt den Code kompilieren (weil der Compiler weiß, wie der Funktionsaufruf aus der Datei .h aussieht), aber der Linker benötigt die Bibliotheksdatei, um den tatsächlichen Code zum Verknüpfen mit Ihrem Programm zu finden.

11

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

gcc -o hello hello.c -lncurses 

Sie meinen wahrscheinlich auch initscr() und getch() zu verwenden. Sobald ich diese Substitutionen mache, kompiliert das obige für mich.

+1

Warum '$ gcc -lncurses -o Hallo hallo.c' funktioniert nicht aber' $ gcc -o hallo hallo.c -lncurses' tut? – rootkea

+0

@rootkea Da der Linker Objekte in der Reihenfolge verarbeitet, in der sie in der Befehlszeile angezeigt werden. Wenn es zuerst "Hallo" sieht, merkt es sich alle Symbole, die es benötigt, und dann, wenn es die 'ncurses'-Bibliothek sieht, löst es diese Symbole mit Hilfe dessen, was es findet, auf. Wenn 'ncurses' zuerst kommt, sieht es eine Reihe von Symbolen, sagt aber" Ich brauche keine von denen "und verwirft sie. Siehe die [Dokumentation] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) oder [andere SO-Aufgaben] (http://stackoverflow.com/questions/45135)/linker-order-gcc) für Details. –

4

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

+0

Das hat mein Problem definitiv gelöst! – Richard

0

Ich hatte ein ähnliches Problem und fand eine Lösung, die mir half, aber war etwas anders als die anderen hier geposteten Antworten. Ich habe versucht, die Platten-Bibliothek mit Flüchen zu verwenden und meine Kompilierungsbefehl war:

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

, wenn ich die anderen Antworten las, war ich verwirrt, weil ich war einschließlich der -lncurses Flagge, aber es war immer noch nicht kompilieren und mit ähnlichen Fehler, was Sie bekommen:

$ gcc -o hello hello.c -lncurses -lpanel 
/usr/lib/gcc/i686-linux-gnu/4.7/../../../../lib/libpanel.a(p_new.o): In function `new_panel': 
p_new.c:(.text+0x18): undefined reference to `_nc_panelhook' 

schließlich fand ich meine Antwort in the tldp:

„Platten-Bibliothek verwenden Funktionen, Sie müssen panel.h einbinden und das Programm mit Panels library verbinden Das Flag -lpanel sollte zusammen mit -lncurses in dieser Reihenfolge hinzugefügt werden. "

Es scheint also, dass die Reihenfolge wichtig ist, wenn Sie die Compile-Flags verwenden! Ich habe versucht, die Reihenfolge zu wechseln:

gcc -o hello hello.c -lpanel -lncurses 

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

Verwandte Themen