2013-02-25 32 views
6

Đây là một vấn đề đáng ngại. Tôi biết chuyện gì đang diễn ra nhưng không phải vì sao. Tôi nhận được một lỗi "tham chiếu không xác định" có nghĩa là trình liên kết (ld) không đặt mã từ thư viện mà tôi đã tạo.Các vấn đề với thư viện ld và tĩnh "tham chiếu không xác định"

Tôi hiện đang lừa xung quanh với Zed A. Shaw "Learn C the Hard Way" khóa học. Tôi đang cố gắng hoàn thành bài tập 32, nhưng tôi vẫn gặp lỗi tương tự.

Trong cuốn sách mà bạn phát triển một làm cho tập tin đó chạy lệnh sau:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG build/liblcthw.a \ 
    tests/list_tests.c -o tests/list_tests 

nơi -g là cho phép thông tin gỡ lỗi, Wall là cho phép "tất cả" cảnh báo, -Wextra là cho phép nhiều cảnh báo, -Isrc để bao gồm thư mục src vào thư mục thư viện, -o tests/list_tests là tạo ra một đầu ra với tên đó trong thư mục đó, -DNDEBUG để kích hoạt một biến từ mã, -O2 để tối ưu hóa mức 2 (điều đó có nghĩa là) và xây dựng/liblcthw.a để bao gồm thư viện đó (thư viện đang xây dựng). Phần còn lại tôi không biết họ làm gì.

Nếu tôi nhận được đúng, có một list.c trong thư mục src tạo danh sách đối tượng.o. Đối tượng này sau đó bao gồm trong lib thông qua ar và ranlib. Vì vậy, gọi danh sách header.h nên làm cho ld tìm trong build/liblcthw.a cho list.o. Vấn đề là ld không đọc build/liblcthw.a vì một số lý do. Vì vậy, tôi nhận được tham chiếu không xác định này để lỗi.

Tôi đã cố gắng liên hệ với Zed nhưng anh ấy là một người đàn ông bận rộn. Vì vậy, tôi hy vọng sẽ nhận được sự giúp đỡ ở đây. Cho tôi biết nếu tôi cần thêm thông tin khác về vấn đề này. Here's liên kết tới toàn bộ thư viện cho đến nay.

Tôi hy vọng ai đó có thể giúp tôi.

+7

Đặt hàng vấn đề. Các thư viện tĩnh đi * sau * các tệp nguồn/đối tượng trong dòng lệnh. –

+0

Tôi không nhận được đề xuất của bạn –

+3

Thay đổi thứ tự của các đối số dòng lệnh. Tệp .c phải đi trước và tệp .a phải đi sau đó. –

Trả lời

6

Công việc sau có hoạt động không?

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests -Lbuild -llcthw 

Điều này không được sử dụng -l tùy chọn liên kết chống lại thư viện, và -L tùy chọn để chỉ định một thư mục thêm nơi mối liên kết nên tìm kiếm các thư viện. Tiền tố lib và hậu tố .a không được chỉ định trong đối số -l.

Lưu ý rằng nếu bạn cũng có thư viện được chia sẻ (* .so) trong thư mục "xây dựng", mọi thứ trở nên phức tạp. Để đơn giản, bạn nên xóa tệp "liblcthw.so" và chỉ giữ "liblcthw.a" hoặc cố gắng liên kết trong thư viện tĩnh bằng cách liệt kê nó làm đầu vào, giống như ban đầu, nhưng chỉ định nó sau tệp nguồn của bạn:

 
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG tests/list_tests.c \ 
    -o tests/list_tests build/liblcthw.a 
+0

Trợ giúp _kinda_ đó. Chương trình được biên dịch nhưng hiện tại trong khi chạy lỗi này xuất hiện "./tests/list_tests: lỗi khi tải thư viện được chia sẻ: liblcthw.so: không thể mở tệp đối tượng được chia sẻ: Không có tệp hoặc thư mục nào" Có phải nó đang tìm liblcthw.so trong thư mục thư viện ? Nếu vậy làm thế nào để tôi tránh điều đó? –

+0

@LucianoRobino * Có * tệp "liblcthw.so" trong thư mục "xây dựng" không? Bởi vì nếu không có, lệnh biên dịch sẽ thất bại. –

+0

Điều này sẽ không sử dụng thư viện tĩnh. –

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