2011-07-05 38 views
69

Tôi cảm thấy lạ khi sử dụng -Wl,-Bstatic để thông báo cho gcc thư viện nào tôi muốn liên kết với tĩnh. Sau khi tất cả tôi đang nói gcc trực tiếp tất cả các thông tin khác về liên kết với các thư viện (-Ldir, -llibname).Nói trực tiếp gcc để liên kết thư viện tĩnh

Có thể cho trình điều khiển gcc trực tiếp thư viện nào nên được liên kết tĩnh không?

Làm rõ: Tôi biết rằng nếu một thư viện nào đó chỉ tồn tại trong các phiên bản tĩnh nó sẽ sử dụng nó mà không -Wl,-Bstatic, nhưng tôi muốn ngụ ý gcc thích thư viện tĩnh. Tôi cũng biết rằng việc chỉ định tệp thư viện trực tiếp sẽ liên kết với nó, nhưng tôi muốn giữ ngữ nghĩa để bao gồm các thư viện tĩnh và động giống nhau.

Trả lời

81

Tất nhiên, có thể sử dụng -l: thay vì -l. Ví dụ: -l:libXYZ.a để liên kết với libXYZ.a. Lưu ý rằng lib được viết ra, trái ngược với -lXYZ sẽ tự động mở rộng thành libXYZ.

+25

Thiên Chúa nếu chỉ Gnu đã thực hiện điều này mặc định ở nơi đầu tiên thay vì tiền tố lib điên rồ. Ôi thời gian và sự thất vọng chúng tôi đã cứu. – Timmmm

+3

Radek, đây là tùy chọn '-l:' được ghi chép? Tôi cần sử dụng phiên bản gcc nào? – osgx

+4

Trên thực tế, nó là tùy chọn của 'ld' linker https://sourceware.org/binutils/docs/ld/Options.html" * '-l namespec' .. Nếu namespec có dạng: filename, ld sẽ tìm kiếm đường dẫn thư viện cho một tệp gọi là tên tệp, nếu không nó sẽ tìm đường dẫn thư viện cho một tệp có tên libnamespec.a .. .. trên hệ thống ELF .., ld sẽ tìm kiếm thư mục cho thư viện có tên libnamespec.so trước khi tìm kiếm tên libnamespec. a. .. Lưu ý rằng hành vi này không áp dụng cho: tên tệp, luôn chỉ định tệp có tên tệp. * ". Kể từ khi binutils 2,18 - https://sourceware.org/binutils/docs-2.18/ld/Options.html – osgx

89

Bạn có thể thêm .a tập tin trong lệnh liên kết:

gcc yourfiles /path/to/library/libLIBRARY.a 

Nhưng điều này không nói chuyện với tài xế gcc, nhưng với ld mối liên kết như các tùy chọn như -Wl,anything đang có.

Khi bạn nói gcc hoặc ld "-Ldir -lLIBRARY", trình liên kết sẽ kiểm tra cả phiên bản tĩnh và động của thư viện (bạn có thể xem quy trình với -Wl,--verbose). Để thay đổi thứ tự các loại thư viện được chọn, bạn có thể sử dụng -Wl,-Bstatic-Wl,-Bdynamic. Đây là một trang man của gnu LD: http://linux.die.net/man/1/ld

Để liên kết chương trình của bạn với lib1, lib3 động và lib2 tĩnh, sử dụng cuộc gọi gcc như:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3 

giả định rằng thiết lập mặc định của ld là sử dụng thư viện động (trên Linux).

+2

Phiên bản ngắn: Không có cách nào để thực hiện điều đó với 'gcc' hiện tại. –

+3

Elazar Leibovich, nhưng 'gcc program.o -llib1 -Wl, -Bstatic -llib2 -Wl, -Bdynamic -llib3' thực hiện thủ thuật. – osgx

+0

Vâng, nhưng câu hỏi đã được cụ thể làm thế nào để làm điều đó KHÔNG dùng để chỉ đạo 'ld' tùy chọn. –

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