2011-07-03 21 views
154

Để thuận tiện, tôi đã thêm các trang có liên quan bên dưới.Tôi không hiểu -Wl, -rpath -Wl,

của tôi (mis) hiểu biết đầu tiên: Nếu tôi cần phải lựa chọn riêng với ,, đó có nghĩa là thứ hai -Wl không phải là một lựa chọn khác bởi vì nó đến trước , có nghĩa là nó là một cuộc tranh cãi đến tùy chọn -rpath.

Tôi không hiểu cách -rpath có thể có đối số -Wl,.!

Điều gì sẽ có ý nghĩa trong tâm trí của tôi sẽ là:

-Wl,-rpath . 

này nên gọi tùy chọn mối liên kết -rpath với đối số thư mục hiện hành.


man gcc:

-Wl, tùy chọn

đèo lựa chọn như một tùy chọn để các mối liên kết. Nếu tùy chọn chứa dấu phẩy, thì được chia thành nhiều tùy chọn tại các dấu phẩy . Bạn có thể sử dụng cú pháp này để chuyển đối số cho tùy chọn. Ví dụ: , -Wl,-Map,output.map vượt qua -Map output.map cho trình liên kết. Khi sử dụng trình liên kết GNU, bạn cũng có thể nhận được cùng tác dụng với `-Wl, -Map = output.map '.

người ld:

-rpath = dir

Thêm một thư mục vào đường dẫn tìm kiếm thư viện runtime. Đây là được sử dụng khi liên kết tệp thực thi ELF với các đối tượng dùng chung. Tất cả các đối số -rpath được nối và chuyển qua tới trình liên kết thời gian chạy, sử dụng chúng để định vị đối tượng được chia sẻ khi chạy. Tùy chọn -rpath cũng được sử dụng khi định vị các đối tượng được chia sẻ là cần thiết bởi các đối tượng được chia sẻ rõ ràng được bao gồm trong liên kết;

Trả lời

182

Các -Wl,xxx lựa chọn cho gcc qua một danh sách bằng dấu phẩy của thẻ như một danh sách không gian tách các đối số cho mối liên kết.Vì vậy,

gcc -Wl,aaa,bbb,ccc 

cuối cùng sẽ trở thành một cuộc gọi mối liên kết

ld aaa bbb ccc 

Trong trường hợp của bạn, bạn muốn nói "ld -rpath .", vì vậy bạn chuyển thông tin này đến gcc như -Wl,-rpath,. Ngoài ra, bạn có thể chỉ định các trường hợp lặp lại -Wl:

gcc -Wl,aaa -Wl,bbb -Wl,ccc 

Lưu ý rằng không có dấu phẩy giữa aaa và số thứ hai -Wl.

Hoặc trong trường hợp của bạn, -Wl,-rpath -Wl,..

+4

Ồ tôi hiểu bây giờ, không có phân biệt đối xử giữa tùy chọn hoặc đối số trong khi truyền nội dung cho trình liên kết, nó chỉ là một chuỗi. Vì vậy, thứ hai -Wl là dư thừa! Cảm ơn :) – Blub

+21

@Blub: Không cần thiết! Đó là một dạng thay thế, bạn * hoặc * nói '-Wl, -rpath, .' * hoặc * bạn nói' -Wl, -rpath -Wl, .'. Chính xác là một trong hai, bạn không thể bỏ qua bất cứ điều gì. –

7

Trang người đàn ông làm cho nó khá rõ ràng. Nếu bạn muốn vượt qua hai đối số (-rpath.) để mối liên kết bạn có thể viết

-Wl,-rpath,. 

hoặc cách khác

-Wl,-rpath -Wl,. 

Những lập luận -Wl,-rpath . bạn đề nghị không làm cho tinh thần để tâm trí của tôi. Làm thế nào là gcc nghĩa vụ phải biết rằng đối số thứ hai của bạn (.) là nghĩa vụ phải được thông qua để các mối liên kết thay vì được giải thích bình thường? Cách duy nhất nó sẽ có thể biết rằng nếu nó có kiến ​​thức nội bộ của tất cả đối số liên kết có thể để nó biết rằng -rpath yêu cầu một đối số sau nó.

+0

nó không phải là không thể tưởng tượng rằng gcc phân tích các đối số và nếu một cái gì đó không có ý nghĩa, nó sẽ tự động nhóm. – Blub

+10

Trên thực tế, nó là –

29

Một điều khác. Bạn có thể cần phải xác định tùy chọn -L cũng - ví dụ

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz 

hoặc bạn có thể kết thúc với một lỗi như

ld: cannot find -lbaz 
50

Bạn cũng có thể viết

-Wl,-rpath=. 

Để thoát khỏi không gian pesky đó. Nó được cho là dễ đọc hơn là thêm dấu phẩy thừa (chính xác là những gì được chuyển tới ld).

+0

Các trang người dùng Debian và Fedora chỉ định theo cách này. – jww

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