Ld tarafından arama sırasını arama sırasına göre yazdırmanın yolu nedir .
Ld tarafından arama sırasını arama sırasına göre yazdırmanın yolu nedir .
Yanıtlar:
Bunu aşağıdaki komutu yürüterek yapabilirsiniz:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc , bağlayıcıya aşağıdaki komutla listeleyebileceğiniz birkaç ekstra -L yolu geçirir:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
İlgili oldukları için yollar yolu ile araştırılmıştır aynı değildir zamanı dinamik bağlayıcı (örneğin, bir program çalıştırılır zaman) tarafından incelenmiştir için kullanımı ld.so dosyasına ve ldconfig'i öneren yanıtları doğru değildir İd (yani her bir program bağlı).
ldArama yolunu geçersiz kılmanın küresel bir yolunu kastetmiştim . Örneğin bazen bir kaynak kodunu derlemek zorunda makefileveya üreten makefile configurekomut dosyası veya gelen CMakeLists.txtya gibi daha karmaşık olanları valaya srt. Bu ldgibi durumlarda arama yolunu değiştirmek benim için zor
Linux'ta, ldconfigld.so yapılandırmasını ve önbelleğini koruyan dizinleri kullanarak arama ld.soyapmak için kullanabilirsiniz.
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -vlinker tarafından (dizin sekmesi olmadan) dizin aramasını ve bu dizinlerde bulunan (önde gelen sekmeyle) paylaşılan kütüphaneleri yazdırır; grepdizinleri alır. Makinemde bu çizgi yazdırılıyor
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
hwcapSatır olmadan ilk yollar yerleşiktir veya /etc/ld.so.conf kaynağından okunur. Bağlayıcı daha sonra temel kütüphane arama yolu altında sse2ek CPU yeteneklerine karşılık gelen adlarla ek dizinleri arayabilir . Çizgideki bu yollar, hwcapbu CPU yetenekleri için uyarlanmış ek kütüphaneler içerebilir.
Son bir not: yukarıdaki -pyerine kullanmak önbelleği -varar ld.so.
export LD_LIBRARY_PATH=/some/other/dirbu komutun çıktısını etkilememesi nasıl mümkün olur ?! % 100 çalışmıyor mu?
LD_LIBRARY_PATHhata ayıklama etkinleştirerek. Örneğin LD_DEBUG=libs /lib/ld-linux.so --list cat(herhangi bir yürütülebilir dosyayı kullanabilirsiniz, aklıma catgelen ilk şey olarak seçtim ). " search path" İçin selamlamaya değer olabilir . /etc/ld.so.cacheTüm gerekli kütüphanelere uyan bir sisteminiz varsa, yerleşik sistem arama yolunu göremeyeceğinizi unutmayın, çünkü o kadar ileri gitmeyecektir.
gccarama yolu bunlarla aynı?
Tam etkili arama yolunu yazdırmak için herhangi bir seçenek olduğundan emin değilim.
Ancak: arama yolu -L, komut satırındaki seçeneklerle belirtilen dizinleri ve ardından SEARCH_DIR("...")bağlayıcı komut dosyalarındaki yönergelerle arama yoluna eklenen dizinleri içerir . Böylece, aşağıdaki gibi yapabileceğiniz her ikisini de görebiliyorsanız çalışabilirsiniz:
ldDoğrudan çağırıyorsanız :
-LSeçenekler olduklarını belirtti modlin vardır.--verboseseçeneği ekleyin . SEARCH_DIR("...")Genellikle çıktının üst kısmına yakın olan yönergeleri arayın . (Bunların her çağrılması için aynı olmaları gerekmediğini unutmayın ld- bağlayıcı, bir dizi farklı yerleşik varsayılan bağlayıcı komut dosyasına sahiptir ve bunlar arasında diğer çeşitli bağlayıcı seçeneklerine göre seçim yapar.)Üzerinden bağlantı yapıyorsanız gcc:
-vSeçeneği gcc, bağlayıcıyı nasıl çağırdığını gösterecek şekilde iletebilirsiniz . Aslında, normal olarak lddoğrudan değil , dolaylı olarak collect2(iç dizinlerinden birinde yaşayan) adlı bir araç aracılığıyla çağırır ve bu da çağırır ld. Bu, hangi -Lseçeneklerin kullanıldığını gösterecektir .-Wl,--verbosesağlamak için gccseçeneklere ekleyebilirsiniz --verbose.-T scriptanlaşılıyor tamamen ld varsayılan betiğin yerini aldı ve sadece işaret ettiğim yere baktı.
Linux'ta gcc ve clang için bulduğum en uyumlu komut (armando.sano sayesinde):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
verirseniz -m32, doğru kütüphane dizinlerini verir.
Makinemdeki örnekler:
için g++ -m64:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
için g++ -m32:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
Soru Linux olarak etiketlenmiş, ancak belki de Linux altında bu işe yarıyor mu?
gcc -Xlinker -v
Mac OS X'te bu yazdırılır:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
-XlinkerSeçeneği gcchemen üstünde geçer -vetmek ld. Ancak:
ld -v
arama yolunu yazdırmaz.
-Lpath. Yani @ Raphaël Londeix'in cevabı daha iyi.
Mac sürümü: $ ld -v 2, ayrıntılı yolların nasıl alınacağını bilmiyorum. çıktı
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld. Binutil millet, yapı komut dosyalarında devre dışı bıraktı. Yıllardır devre dışı bırakıldı.
/usr/local/..eksik kitaplık hatasına neden olan el ile yüklenen kitaplıkları bulur ve bağlantı başarısız olur./usr/localBu arama yolunu hariç tutmak için her zaman yeniden adlandırmam gerekiyor./usr/localYolu hariç tutmanın veya geçersiz kılmanın basit bir yolu var mı ?