2015-01-22 18 views
10

Tôi thấy rằng cờ -L phải được cung cấp khi sử dụng -rpath. Ví dụ:Tại sao -L cần thiết khi -rath được sử dụng?

gcc -o test test.o -L. -lmylib -Wl,-rpath=. 

Tại sao cờ -L cần thiết? Thông tin nào khác hơn thông tin từ các tệp h cần thiết tại biên dịch thời gian?

Nếu tôi xóa -L. Tôi nhận được thông báo sau:

gcc -o test test.o -lmylib -Wl,-rpath=. 
/usr/bin/ld: cannot find -lmyLib 

Bạn hoàn toàn có thể xóa cả hai cờ. Như thế này:

gcc -o test test.o -lmylib 

Miễn là bạn có thể tìm thấy libmyLib trong/usr/lib, tức là. Tại sao không phải là -L bây giờ?

Đây là câu hỏi tiếp theo cho https://stackoverflow.com/a/8482308/1091780.

+0

Trình liên kết không có ý tưởng về những "tệp h" ngớ ngẩn này. –

Trả lời

13

Ngay cả thư viện động cũng yêu cầu mức độ liên kết tĩnh; trình liên kết cần phải biết các ký hiệu động nào được cung cấp bởi thư viện động. Sự khác biệt chính là thư viện động cung cấp định nghĩa khi chạy, trong khi thư viện tĩnh hoàn toàn cung cấp định nghĩa tại thời gian liên kết.

Vì lý do này, cần -L để chỉ định nơi tệp sẽ liên kết ngược lại, giống như -l chỉ định thư viện cụ thể. . cho biết thư mục hiện tại.

-rpath có hiệu lực khi chạy, khi ứng dụng cố tải thư viện động. Nó thông báo cho chương trình của một vị trí bổ sung để tìm kiếm khi cố tải một thư viện động.

Lý do -L/usr/lib không cần phải được chỉ định là do trình liên kết đang tìm kiếm theo mặc định (vì đây là nơi rất phổ biến để đặt thư viện).

+0

Tôi vẫn không hiểu loại thông tin nào cần được cung cấp tại thời điểm xây dựng. Và nhìn vào ví dụ cuối cùng của tôi (tôi đã thêm một ví dụ ở cuối). Làm thế nào đến thông tin thời gian xây dựng này là không cần thiết khi cả hai lá cờ được gỡ bỏ? –

+0

@FredrikJohansson cập nhật này có giúp ích gì không? – OMGtechy

0

Làm rõ câu trả lời của OMGtechy.

Nếu trình liên kết không kiểm tra những biểu tượng nào được cung cấp bởi thư viện, nó không bao giờ có thể cho bạn biết nếu bất kỳ ký hiệu nào bị thiếu tại thời gian biên dịch. Chúng có thể nằm trong một trong các thư viện được tải vào thời gian chạy. Bạn không bao giờ có thể biết. Không có kết nối lúc biên dịch giữa các tệp tiêu đề của thư viện và tệp .so.

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