2009-04-30 10 views
9

Tôi đang cố gắng bắt đầu phát triển một chương trình bằng cách sử dụng ncurses trên Linux. Tôi thậm chí không thể lấy ví dụ Hello World để biên dịch. Dưới đây là các mã:Tham chiếu không xác định khi sử dụng ncurses trên linux

#include <curses.h> 

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

Khi tôi cố gắng để biên dịch, tôi nhận được:

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

Đối với mỗi một trong những người được gọi chức năng.

Tôi đã cài đặt ncurses qua apt-get, và cũng có thể bằng cách tải về các nguồn và biên dịch, cài đặt vv

Tôi đã thử #include cả curses.hncurses.h.

Điều gì đang xảy ra?

Trả lời

12

Bạn đã sử dụng tùy chọn -lcurses khi liên kết? Bao gồm các tệp tiêu đề cho phép biên dịch mã (vì trình biên dịch biết hàm gọi trông như thế nào từ tệp .h), nhưng trình liên kết cần tệp thư viện để tìm mã thực tế để liên kết đến chương trình của bạn.

11

Như Greg Hewgill đã nói, bạn cần phải nhập số -lcurses hoặc -lncurses để liên kết tới thư viện lời nguyền.

gcc -o hello hello.c -lncurses 

Bạn cũng có thể muốn sử dụng initscr()getch(). Một khi tôi thực hiện những thay thế đó, những phần biên dịch trên cho tôi.

+1

Tại sao '$ gcc -lncurses -o hello hello.c' không hoạt động nhưng' $ gcc -o hello hello.c -lncurses' làm gì? – rootkea

+0

@rootkea Vì trình liên kết hoạt động trên các đối tượng theo thứ tự chúng xuất hiện trong dòng lệnh. Khi nó thấy 'hello' trước, nó nhớ tất cả các ký hiệu cần thiết, và sau đó khi nó nhìn thấy thư viện' ncurses', nó giải quyết những biểu tượng đó bằng cách sử dụng những gì nó tìm thấy. Nếu 'ncurses' xuất hiện đầu tiên, nó sẽ thấy một loạt các biểu tượng nhưng nói" Tôi không cần bất kỳ cái nào trong số đó "và loại bỏ chúng. Xem [tài liệu] (https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#index-l-1172) hoặc [các nhiệm vụ SO khác] (http://stackoverflow.com/questions/45135/linker-order-gcc) để biết chi tiết. –

4

Đối với bất kỳ ai gặp sự cố tương tự: đối số -lx, trong đó x là thư viện của bạn, phải luôn theo dõi tệp nguồn và đối tượng.

+0

Điều này chắc chắn đã giải quyết được vấn đề của tôi! – Richard

0

Tôi đã gặp sự cố tương tự và tìm thấy giải pháp đã giúp tôi, nhưng hơi khác so với các câu trả lời khác được đăng ở đây. Tôi đã cố gắng sử dụng các thư viện, tấm gỗ với lời nguyền và lệnh biên dịch của tôi là:

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

khi tôi đọc những câu trả lời khác, tôi đã bối rối vì tôi bao gồm cờ -lncurses, nhưng nó vẫn không được biên dịch , và với các lỗi tương tự như những gì bạn đã nhận:

$ 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' 

cuối cùng tôi đã tìm thấy câu trả lời của tôi trong the tldp:

"để sử dụng thư viện tấm chức năng, bạn phải bao gồm panel.h và để liên kết chương trình với các thư viện bảng cờ - cờ nên được thêm cùng với -lncurses theo thứ tự đó. "

Vì vậy, có vẻ như thứ tự quan trọng khi sử dụng cờ biên dịch! Tôi đã thử chuyển đổi thứ tự:

gcc -o hello hello.c -lpanel -lncurses 

Điều này cho phép nó biên dịch thành công. Tôi biết bạn đã có câu trả lời của bạn, vì vậy tôi hy vọng điều này sẽ giúp một người nào đó.