Saya tidak mengerti -Wl, -rpath -Wl,


244

Untuk kenyamanan saya menambahkan halaman manual yang relevan di bawah ini.

Pemahaman (salah) saya yang pertama: Jika saya perlu memisahkan opsi ,, itu berarti yang kedua -Wlbukan opsi lain karena ia datang sebelumnya ,yang berarti ini adalah argumen untuk -rpathopsi.

Saya tidak mengerti bagaimana -rpathbisa -Wl,.berdebat!

Apa yang masuk akal di benak saya adalah ini:

-Wl,-rpath .

Ini harus memanggil opsi -rpath linker dengan argumen direktori saat ini.


man gcc:

-Wl, opsi

Lulus opsi sebagai opsi ke tautan. Jika opsi berisi koma, itu dibagi menjadi beberapa opsi di koma. Anda dapat menggunakan sintaks ini untuk meneruskan argumen ke opsi. Misalnya, -Wl,-Map,output.mapberalih -Map output.mapke tautan. Saat menggunakan penghubung GNU, Anda juga bisa mendapatkan efek yang sama dengan `-Wl, -Map = output.map '.

man ld:

-rpath = dir

Tambahkan direktori ke jalur pencarian perpustakaan runtime. Ini digunakan saat menghubungkan ELF yang dapat dieksekusi dengan objek bersama. Semua -rpath argumen disatukan dan diteruskan ke linker runtime, yang menggunakannya untuk menemukan objek bersama saat runtime. Opsi -rpath juga digunakan ketika menemukan objek bersama yang dibutuhkan oleh objek bersama secara eksplisit termasuk dalam tautan;


2
Bukankah judulnya hilang karakter titik pada akhirnya?
Celdor

Jawaban:


277

The -Wl,xxxpilihan untuk gcc melewati daftar dipisahkan koma token sebagai daftar dipisahkan dengan spasi dari argumen ke linker . Begitu

gcc -Wl,aaa,bbb,ccc

akhirnya menjadi panggilan tautan

ld aaa bbb ccc

Dalam kasus Anda, Anda ingin mengatakan " ld -rpath .", sehingga Anda meneruskannya ke gcc sebagai -Wl,-rpath,.Alternatifnya, Anda dapat menentukan contoh berulang -Wl:

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

Perhatikan bahwa tidak ada koma antara aaadan yang kedua -Wl.

Atau, dalam kasus Anda -Wl,-rpath -Wl,.,.


5
Oh saya mengerti sekarang, tidak ada diskriminasi antara opsi atau argumen saat memberikan barang kepada linker, itu hanya string. Jadi -Wl kedua adalah redundan! Terima kasih :)
Blub

29
@ Blub: Itu tidak berlebihan! Ini adalah bentuk alternatif, Anda baik katakan -Wl,-rpath,. atau Anda katakan -Wl,-rpath -Wl,.. Salah satu dari keduanya, Anda tidak bisa menghilangkan apa pun.
Kerrek SB

Adakah yang berhasil mengatur rpath di OS X, yaitu dengan clang & ld64?
ben-albrecht

Seperti apa sintaksisnya jika Anda ingin menentukan beberapa rpath? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron

1
@Intron: Ya, atau -Wl,-rpath,dir1,-rpath,dir2, atau -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB

63

Anda juga bisa menulis

-Wl,-rpath=.

Untuk menyingkirkan ruang sial itu. Ini bisa dibilang lebih mudah dibaca daripada menambahkan koma tambahan (itulah yang diteruskan ke ld).


3
Dari gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options di bawah -Wl,option: " Saat menggunakan penghubung GNU , Anda juga bisa mendapatkan efek yang sama dengan -Wl, -Map = output.map." Bagi saya, itu tampaknya menunjukkan bahwa jika Anda menggunakan tautan selain penghubung GNU, =sintaksis mungkin tidak didukung.
Hintron

39

Satu hal lagi. Anda mungkin perlu menentukan opsi -L juga - misalnya

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

atau Anda mungkin berakhir dengan kesalahan seperti

ld: cannot find -lbaz

10

Halaman manual membuatnya cukup jelas. Jika Anda ingin memberikan dua argumen ( -rpathdan .) ke tautan Anda dapat menulis

-Wl,-rpath,.

atau sebagai alternatif

-Wl,-rpath -Wl,.

Argumen yang -Wl,-rpath .Anda sarankan TIDAK masuk akal bagi saya. Bagaimana gcc seharusnya tahu bahwa argumen kedua Anda ( .) seharusnya diteruskan ke tautan daripada ditafsirkan secara normal? Satu-satunya cara untuk mengetahui hal itu adalah jika ia memiliki pengetahuan orang dalam tentang semua argumen penghubung yang mungkin sehingga ia tahu bahwa -rpathdiperlukan argumen setelahnya.


itu tidak terpikirkan bahwa gcc menganalisis argumen dan jika sesuatu tidak masuk akal, ia secara otomatis dikelompokkan.
Blub
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.