2013-01-19 37 views
25

Tôi đang chạy Ubuntu 12.04 và tôi hiện đang làm việc trên một dự án liên quan đến C, OpenGL, một phương pháp ấm trà và đầu vào.gcc/usr/bin/ld: lỗi: không thể tìm thấy -lncurses

Sự cố bắt đầu khi tôi quyết định có các phím mũi tên làm đầu vào. Tôi đã kiểm tra để xem các mã khóa cho các phím mũi tên nhưng tất cả các mũi tên trả về 0. Tôi đã tìm cách để làm việc này và tôi đã tìm thấy conio.h. Thật không may, nó là một tiêu đề DOS cũ mà không có sẵn cho Linux. Sau đó, tôi tìm thấy một thay thế được gọi là ncurses.

Sau khi cài đặt các thư viện cần thiết, bằng cách làm theo hướng dẫn xây dựng chặt chẽ, tôi #included curses.h trong nguồn main.c của tôi. Khi lần đầu tiên tôi đã cố gắng để biên dịch sử dụng gcc, tôi có các lỗi sau đây:

main.o:main.c:function _Key: error: undefined reference to 'stdscr' 
main.o:main.c:function _Key: error: undefined reference to 'wgetch' 
main.o:main.c:function _Key: error: undefined reference to 'stdscr' 
main.o:main.c:function _Key: error: undefined reference to 'wgetch' 

Tôi tìm thấy một sửa chữa bằng cách thêm -lncurses đến makefile như vậy:

SOURCES=main.c 

main: main.o 
    gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main 

main.o: main.c 
    gcc -lm -lGL -lGLU -lglut -c main.c 

Nhưng tôi đã được chào đón bởi một lỗi khác :

/usr/bin/ld: error: cannot find -lncurses 

Cũng như các lỗi trước đó.

Tôi đã dành 2 ngày cuối cùng để tìm kiếm cả diễn đàn Ubuntu và StackOverFlow. Bất kỳ trợ giúp sẽ được đánh giá cao.

P.S. Tôi không biết nếu điều này là quan trọng nhưng khi tôi cố gắng chạy/usr/bin/ld tôi nhận được lỗi này:

ld: fatal error: no input files 
+20

'apt-get install gói libncurses5-dev'? – trojanfoe

+0

tại sao những nhận xét này phải quá nhỏ -_- Tôi không thấy nhận xét của bạn trước đây nhưng đó là bản sửa lỗi. Dunno tại sao nhưng có vẻ như tôi đã cài đặt một số phiên bản không chính thức mà trình biên dịch không nhận ra. Cảm ơn mọi người! – Yrrej10

Trả lời

2

Trước hết, bạn nên đặt các thư viện sau các tập tin đối tượng khi liên kết. Và không có chúng ở tất cả trong việc biên dịch của tập tin nguồn.

Sau đó, nếu kernel không được cài đặt trong một thư mục tìm kiếm chuẩn bạn cần phải chỉ ra cho các mối liên kết nó ở đâu, điều này được thực hiện với dòng tùy chọn -L lệnh:

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses 
1

Hãy thử cài đặt ncurses-static gói quá, nếu bạn chỉ có gói ncurses-devel được cài đặt trong hệ điều hành Ubuntu của bạn.

Nếu điều đó giải quyết được vấn đề của bạn, cộng thêm nếu bạn thêm hướng dẫn biên dịch @ Joachim, bạn sẽ có một khởi đầu tuyệt vời.

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses 

Trình liên kết không thể tìm thấy thư viện được chia sẻ của bạn trong đường dẫn tìm kiếm. Nếu bạn thêm thư mục mà lib được chia sẻ của bạn vào biến môi trường LD_LIBRARY_PATH, trình liên kết sẽ tìm thấy nó và có thể liên kết với nó. Trong trường hợp đó bạn có thể bỏ qua tùy chọn -L để gcc:

gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses 

Và nó nên biên dịch tốt.

EDIT: Điều cần biết là apt-get install libncurses5-dev khắc phục sự cố của bạn.

FYI. Biến môi trường LD_LIBRARY_PATH chứa danh sách đường dẫn được phân tách bằng dấu hai chấm mà trình liên kết sử dụng để giải quyết các phụ thuộc thư viện vào thời gian chạy. Những đường dẫn này sẽ được ưu tiên hơn đường dẫn thư viện chuẩn /lib/usr/lib.Các đường dẫn tiêu chuẩn sẽ vẫn được tìm kiếm, nhưng chỉ sau khi danh sách đường dẫn trong LD_LIBRARY_PATH đã hết.

Cách tốt nhất để sử dụng LD_LIBRARY_PATH là đặt nó trên dòng lệnh hoặc tập lệnh ngay trước khi thực hiện chương trình. Bằng cách này, bạn có thể giữ LD_LIBRARY_PATH mới được phân lập với phần còn lại của hệ thống, ví dụ: địa phương cho phiên bản hiện tại đang chạy của trình bao.

$ export LD_LIBRARY_PATH="/path/to/libncurses/library/directory/:$LD_LIBRARY_PATH" 
$ gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses 
+0

Vẫn còn nhiều sự cố:/ 1. Tôi chỉ libncurses.so.5 và libncurses.so.5.9 cả hai đều không được reconginzed 2. Trường hợp nào tìm biến LD_LIBRARY_PATH – Yrrej10

+0

Bạn không muốn sử dụng '$ LD_LIBRARY_PATH'; nếu bạn cần cấu hình đường dẫn trình nạp không chuẩn, sau đó tạo một tệp trong '/ etc/ld.so.conf.d'. – trojanfoe

+0

Bây giờ tôi đang bối rối. Tôi đã xem các tệp trong thư mục /etc/ld.so.conf.d và thư viện ncurses nằm trong các thư mục đó: lib/i386-linux-gnu và usr/lib/i386-linux-gnu – Yrrej10

39

Đối với bất kỳ ai có cùng vấn đề tôi gặp phải: Tôi thiếu thư viện 32 bit; Tôi đã biên dịch 32 bit trên một máy chủ 64 bit bị thiếu gói lib32ncurses5-dev.

Trên Ubuntu Tôi chỉ đơn giản là chạy:

sudo apt-get install lib32ncurses5-dev 
+7

Tôi không thể cài đặt gnureadline thông qua pip, python 2,7 và điều này giải quyết vấn đề của tôi. – rioted

Các vấn đề liên quan