Memberitahu gcc secara langsung untuk menautkan perpustakaan secara statis

133

Rasanya aneh bagi saya untuk menggunakannya -Wl,-Bstaticuntuk memberi tahu gccperpustakaan mana yang ingin saya tautkan secara statis. Setelah semua, saya memberi tahu gccsecara langsung semua informasi lain tentang menghubungkan dengan perpustakaan ( -Ldir, -llibname).

Apakah mungkin untuk memberi tahu driver gcc secara langsung perpustakaan mana yang harus ditautkan secara statis?

Klarifikasi: Saya tahu bahwa jika perpustakaan tertentu hanya ada dalam versi statis, ia akan menggunakannya tanpa -Wl,-Bstatic, tetapi saya ingin menyiratkan gccuntuk memilih perpustakaan statis. Saya juga tahu bahwa menentukan file perpustakaan secara langsung akan terhubung dengannya, tetapi saya lebih suka menjaga semantik untuk menyertakan perpustakaan statis dan dinamis tetap sama.

Elazar Leibovich
sumber

Jawaban:

189

Mungkin saja, gunakan -l:saja -l. Misalnya -l:libXYZ.auntuk terhubung dengan libXYZ.a. Perhatikan yang libditulis, sebagai lawan -lXYZyang akan diperluas secara otomatis libXYZ.

Radek
sumber
63
Ya Tuhan seandainya saja Gnu yang menjadikan ini default di tempat pertama alih-alih kegilaan awalan Lib. Oh, waktu dan frustrasi yang kami selamatkan.
Timmmm
9
Radek, apakah -l:opsi ini didokumentasikan? Versi gcc mana yang harus saya gunakan?
osgx
18
Sebenarnya, itu adalah opsi dari ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Jika namespec adalah dalam bentuk: nama file, ld akan mencari path perpustakaan untuk file bernama filename, jika tidak akan mencari perpustakaan path untuk file bernama libnamespec.a ... pada sistem ELF .., ld akan mencari direktori untuk pustaka yang disebut libnamespec.so sebelum mencari yang bernama libnamespec.a ... Perhatikan bahwa perilaku ini tidak berlaku untuk: nama file , yang selalu menentukan file bernama nama file. " Sejak binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx
17
GNU tidak bertanggung jawab untuk antarmuka ini, ia diwarisi dari Unchain toolchain.
akim
Sayang sekali ini tidak bekerja di penghubung non-GNU. Ini cara yang bagus untuk "memaksa" LDLIBS dan opsi konfigurasi serupa untuk menemukan pustaka statis tanpa solusi flag link yang aneh.
nneonneo
130

Anda dapat menambahkan file .a dalam perintah penautan:

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

Tapi ini tidak berbicara dengan driver gcc, tetapi dengan ldlinker seperti opsi yang -Wl,anythingada.

Saat Anda memberi tahu gcc atau ld -Ldir -lLIBRARY, tautan akan memeriksa versi perpustakaan statis dan dinamis (Anda dapat melihat prosesnya dengan -Wl,--verbose). Untuk mengubah urutan jenis perpustakaan diperiksa, Anda dapat menggunakan -Wl,-Bstaticdan -Wl,-Bdynamic. Berikut ini adalah halaman manual gnu LD: http://linux.die.net/man/1/ld

Untuk menautkan program Anda dengan lib1, lib3 secara dinamis dan lib2 secara statis, gunakan panggilan gcc tersebut:

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

Dengan asumsi bahwa pengaturan default ld adalah dengan menggunakan perpustakaan dinamis (ada di Linux).

osgx
sumber
3
Versi singkat: Tidak ada cara untuk melakukannya dengan arus gcc.
Elazar Leibovich
7
Elazar Leibovich, tetapi gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3melakukan trik.
osgx
13
Menghubungkan (dan mencari dyn / static libs) dilakukan oleh linker, Jadi, Anda harus menggunakan opsi Linker. -ldan -Ljuga opsi tautan.
osgx
3
Apakah jawaban ini dibatalkan karena gcc yourfiles /path/to/library/libLIBRARY.aatau -Wl,-Bstatic?
Tor Klingberg
7
@TorKlingberg, Varian 1 /path/to/library/libLIBRARY.aperlu path lengkap untuk ditulis, varian 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamichanya panjang dan menambahkan 2 opsi tambahan dan menganggap mode default sebagai Bdynamic, dan varian yang diterima 3 -l:libXYZ.apendek dan hanya berfungsi. Ketiganya akan berfungsi untuk banyak kasus, dan varian 2 mungkin tidak berfungsi saat menautkan program statis. Langkah menghubungkan aktual untuk lib adalah sama di semua varian seperti yang saya mengerti.
osgx