Nói gcc trực tiếp để liên kết một thư viện tĩnh


133

Tôi cảm thấy lạ khi sử dụng -Wl,-Bstaticđể cho biết gccthư viện nào tôi muốn liên kết với tĩnh. Sau tất cả, tôi đang nói gcctrự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).

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

Làm rõ: Tôi biết rằng nếu một thư viện nhất định chỉ tồn tại trong các phiên bản tĩnh thì nó sẽ sử dụng mà không có -Wl,-Bstatic, nhưng tôi muốn ngụ ý gccthích thư viện tĩnh hơn. 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 thích giữ ngữ nghĩa để bao gồm các thư viện tĩnh và động giống nhau.

Câu trả lời:


189

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


63
Lạy chúa, nếu chỉ có Gnu đã biến điều này thành mặc định ngay từ đầu thay vì sự điên rồ của tiền tố lib. Oh thời gian và sự thất vọng chúng ta sẽ có được.
Timmmm

9
Radek, -l:tùy chọn này là tài liệu? Phiên bản nào của gcc tôi cần sử dụng?
osgx

18
Trên thực tế, đó là tùy chọn của ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Nếu tênpec có dạng: tên tệp, ld sẽ tìm kiếm đường dẫn thư viện cho một tệp có tên tệp, nếu không nó sẽ tìm kiếm thư viện đường dẫn cho một tệp có tên libnamespec.a. .. trên ELF .. hệ thống, ld sẽ tìm kiếm một thư mục cho một thư viện có tên libnamespec.so trước khi tìm kiếm một tên gọi 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 một tệp gọi là tên tệp. ". Kể từ binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
GNU không chịu trách nhiệm cho giao diện này, nó được kế thừa từ chuỗi công cụ Unix.
akim

Thật xấu hổ khi điều này không hoạt động trong các trình liên kết không phải GNU. Đó là một cách hay để "buộc" LDLIBS và các tùy chọn cấu hình tương tự để tìm các thư viện tĩnh mà không có cách giải quyết cờ liên kết lạ.
nneonneo

130

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

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

Nhưng đây không phải là nói chuyện với trình điều khiển gcc, mà với ldtrình liên kết là các tùy chọn như thế -Wl,anything.

Khi bạn nói vớ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ể thấy một quy trình với -Wl,--verbose). Để thay đổi thứ tự các loại thư viện được kiểm tra, bạn có thể sử dụng -Wl,-Bstatic-Wl,-Bdynamic. Đây là trang nam 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 một cách linh hoạt và lib2 tĩnh, hãy sử dụng lệnh gọi gcc như vậy:

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

Giả sử rằng cài đặt mặc định của ld là sử dụng các thư viện động (nó có trên Linux).


3
Phiên bản ngắn: Không có cách nào để làm điều đó với hiện tại gcc.
Elazar Leibovich

7
Elazar Leibovich, nhưng gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3thực hiện các mẹo.
osgx

13
Việc liên kết (và tìm kiếm dyn / libs tĩnh) được thực hiện bởi trình liên kết, vì vậy, bạn phải sử dụng các tùy chọn Trình liên kết. -l-Llà các tùy chọn liên kết quá.
osgx

3
Là câu trả lời này được nâng cao vì gcc yourfiles /path/to/library/libLIBRARY.ahay -Wl,-Bstatic?
Tor Klingberg

7
@TorKlingberg, Biến thể 1 /path/to/library/libLIBRARY.acần đường dẫn đầy đủ để viết, biến thể 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicchỉ dài và thêm 2 tùy chọn bổ sung và giả sử chế độ mặc định là Bdynamic, và biến thể 3 -l:libXYZ.ađược chấp nhận là ngắn và chỉ hoạt động. Cả ba sẽ hoạt động trong nhiều trường hợp và biến thể 2 có thể không hoạt động khi liên kết các chương trình tĩnh. Bước liên kết thực tế cho lib là giống nhau trong tất cả các biến thể như tôi hiểu.
osgx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.