Rasanya aneh bagi saya untuk menggunakannya -Wl,-Bstatic
untuk memberi tahu gcc
perpustakaan mana yang ingin saya tautkan secara statis. Setelah semua, saya memberi tahu gcc
secara 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 gcc
untuk 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.
sumber
-l:
opsi ini didokumentasikan? Versi gcc mana yang harus saya gunakan?ld
linker 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.htmlAnda dapat menambahkan file .a dalam perintah penautan:
Tapi ini tidak berbicara dengan driver gcc, tetapi dengan
ld
linker seperti opsi yang-Wl,anything
ada.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,-Bstatic
dan-Wl,-Bdynamic
. Berikut ini adalah halaman manual gnu LD: http://linux.die.net/man/1/ldUntuk menautkan program Anda dengan lib1, lib3 secara dinamis dan lib2 secara statis, gunakan panggilan gcc tersebut:
Dengan asumsi bahwa pengaturan default ld adalah dengan menggunakan perpustakaan dinamis (ada di Linux).
sumber
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
melakukan trik.-l
dan-L
juga opsi tautan.gcc yourfiles /path/to/library/libLIBRARY.a
atau-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
perlu path lengkap untuk ditulis, varian 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
hanya panjang dan menambahkan 2 opsi tambahan dan menganggap mode default sebagai Bdynamic, dan varian yang diterima 3-l:libXYZ.a
pendek 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.