Anlamıyorum -Wl, -rpath -Wl,


245

Kolaylık sağlamak için ilgili ilgili sayfaları aşağıya ekledim.

Önce benim (yanlış) anlayışım: Eğer seçenekleri ayırmak ,gerekirse, ikincisinin -Wlbaşka bir seçenek olmadığı anlamına gelir, çünkü daha önce ,gelir, bu -rpathseçenek için bir argüman olduğu anlamına gelir .

Ben anlamıyorum -rpathbir olabilir -Wl,.argüman!

Aklımda mantıklı olan şu olurdu:

-Wl,-rpath .

Bu, geçerli dizin bağımsız değişkeniyle -rpath linker seçeneğini çağırmalıdır.


adam gcc:

-Wl, seçenek

Seçeneği bağlayıcıya geçir seçeneği. Seçenek virgül içeriyorsa, virgülde birden çok seçeneğe bölünür. Seçeneğe bir argüman iletmek için bu sözdizimini kullanabilirsiniz. Örneğin , bağlayıcıya -Wl,-Map,output.mapgeçer -Map output.map. GNU bağlayıcısını kullanırken, aynı efekti `-Wl, -Map = output.map 'ile de alabilirsiniz.

adam ld:

-rpath = dir

Çalışma zamanı kitaplığı arama yoluna bir dizin ekleyin. Bu, bir ELF yürütülebilir dosyasını paylaşılan nesnelerle bağlarken kullanılır. Tüm -rpath argümanları birleştirilir ve çalışma zamanında paylaşılan nesneleri bulmak için bunları kullanan çalışma zamanı bağlayıcısına iletilir. -Rpath seçeneği, bağlantıya açıkça dahil edilen paylaşılan nesnelerin ihtiyaç duyduğu paylaşılan nesneleri bulurken de kullanılır;


2
Başlık sonunda nokta karakteri eksik değil mi?
Celdor

Yanıtlar:


278

-Wl,xxxSeçeneği gcc için bir bağımsız değişken bir alan ayrılmış liste olarak jeton virgülle ayrılmış liste geçirir bağlayıcı . Yani

gcc -Wl,aaa,bbb,ccc

sonunda bir linker çağrısı olur

ld aaa bbb ccc

Sizin durumunuzda, " ld -rpath ." demek istersiniz , böylece bunu gcc'ye -Wl,-rpath,.Alternatif olarak geçirirsiniz -Wl:

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

aaaİkinci ile ikinci arasında virgül olmadığını unutmayın -Wl.

Veya, senin durumunda -Wl,-rpath -Wl,..


5
Oh şimdi anlıyorum, bağlayıcıya bir şeyler aktarırken seçenek veya argüman arasında hiçbir ayrımcılık yok, sadece bir dize. Yani ikincisi -Wl artık! Teşekkürler :)
Blub

29
@Blub: Gereksiz değil! Bu alternatif formu, sen ya demek -Wl,-rpath,. ya diyorsunuz -Wl,-rpath -Wl,.. Tam olarak ikisinden biri, hiçbir şeyi atlayamazsınız.
Kerrek SB

Herkes OS X, yani clang & ld64 ile rpath ayarlamakta başarılı oldu mu?
ben-albrecht

Birden çok rpath belirtmek isterseniz sözdizimi nasıl görünür? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
19:19, Hintron

1
@Hintron: Evet veya -Wl,-rpath,dir1,-rpath,dir2, veya -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB

63

Ayrıca yazabilirsin

-Wl,-rpath=.

O sinir bozucu alandan kurtulmak için. Ekstra virgül eklemekten daha fazla okunabilir (tam olarak ld'ye geçirilen şey).


3
Gönderen gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options altında -Wl,option: " GNU linker kullanırken ., Ayrıca -Wl, -Harita = output.map ile aynı etkiyi elde edebilirsiniz" Bana göre bu, GNU bağlayıcısından başka bir bağlayıcı kullanırsanız =sözdiziminin desteklenmeyebileceğini gösteriyor.
19'da Hintron

39

Diğer bir şey. -L seçeneğini de belirtmeniz gerekebilir - ör.

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

veya bunun gibi bir hatayla karşılaşabilirsiniz

ld: cannot find -lbaz

10

Man sayfası bunu açıkça ortaya koyuyor. Bağlayıcıya iki argüman ( -rpathve .) iletmek isterseniz,

-Wl,-rpath,.

Veya alternatif olarak

-Wl,-rpath -Wl,.

-Wl,-rpath .Önerdiğiniz argümanlar aklıma anlamsız geliyor. Gcc'nin, ikinci argümanınızın ( .) normal olarak yorumlanmak yerine bağlayıcıya aktarılması gerektiğini nasıl bilebilir ? Bunu bilmenin tek yolu, olası tüm bağlayıcı argümanları hakkında içeriden bilgi sahibi olmasıydı, bu yüzden ondan -rpathsonra bir argüman gerektirdiğini biliyordu .


gcc'nin argümanları analiz etmesi düşünülemez ve bir şey mantıklı değilse otomatik olarak gruplanır.
Blub
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.