← man/dev_and_programming
libtool — man libtool — 80×24
ugur@toprak:~/man/dev_and_programming$man libtool
Bölüm 1 Geliştirme & Programlama

libtool

statik kütüphaneler oluşturur ranlib - arşiv kütüphanelerinin içindekiler tablosunu ekler veya günceller

Özet

       libtool -static -o output [ -sacLTD ] [ - ] [ -arch_only arch_type ] [
       -no_warning_for_no_symbols ] [ -encode_sdk_libraries_as_references ] [ -ref-l ] [
       -ref-framework ] file...  [-filelist listfile[,dirname]]

       ranlib [ -sactfqLT ] [ - ] archive...

Açıklama

libtool komutu, belirtilen girdi nesne dosyalarını alır ve bağlantı düzenleyici ld(1) ile kullanılmak üzere bir kütüphane oluşturur. Kütüphanenin adı, output ( -o bayrağının argümanı) ile belirtilir. Girdi nesne dosyaları, nesne dosyalarını içeren herhangi bir doğru biçimde olabilir (``evrensel'' (universal) dosyalar, arşivler, nesne dosyaları). Libtool, çıktı kütüphanesine nesne olmayan hiçbir girdi dosyasını koymaz (üzerinde işlem yaptığı arşivlerde buna izin veren ranlib'in aksine).

Aynı CPU türündeki ve farklı CPU alt türlerindeki nesnelerden ``evrensel'' bir dosya üretirken, libtool and ranlib, CPU türü ve CPU alt türünün her benzersiz eşleşmesi için evrensel bir dosyada ayrı bir kütüphane oluşturmak yerine, her CPU türü için en fazla bir kütüphane oluşturur. Böylece, her kütüphane için ortaya çıkan CPU alt türü, o CPU türü için _ALL CPU alt türü olur. Bu strateji, bir kütüphanenin geliştiricisini, bağlantı zamanı yerine çalışma zamanında çalıştırılacak en uygun kodu seçen tek bir kütüphane oluşturmaya güçlü bir şekilde teşvik eder.

ARŞİV (veya statik) KÜTÜPHANELERİ libtool -static seçeneği ile ar(5) ve ranlib'in yerini alması amaçlanmıştır. Geriye dönük uyumluluk için ranlib hala mevcuttur ve evrensel dosyaları destekler. Ranlib, bağlantı düzenleyici ld(1) tarafından bağlanabilmesi için her arşive içindekiler tablosunu ekler veya günceller. İçindekiler tablosu, arşivin başında yer alan ve hangi sembollerin hangi kütüphane üyelerinde tanımlandığını belirten bir arşiv üyesidir. Ranlib arşivi yeniden yazdığı için, geçerli dizini barındıran dosya sisteminde yeterli geçici dosya alanı bulunmalıdır. Ranlib, kütüphanelerin tüm doğru biçimlerini (arşivleri içeren evrensel dosyalar ve basit arşivler) alır ve dosyadaki tüm arşivler için içindekiler tablosunu günceller. Ranlib ayrıca, üyeleri evrensel nesne dosyaları olan arşivler şeklindeki yaygın bir hatalı arşiv biçimini de kabul eder, içindekiler tablosunu ekler veya günceller ve kütüphaneyi doğru biçimde (birden fazla arşiv içeren evrensel bir dosya) üretir.

İçindekiler tablosunun arşiv üyesi adı ``__.SYMDEF'' ile başlar. Şu anda libtool -static ve ranlib tarafından üretilen ve bağlantı düzenleyici ld(1) tarafından anlaşılan iki tür içindekiler tablosu vardır. Bunlar aşağıda, -s ve -a seçenekleri altında açıklanmıştır.

Seçenekler

Aşağıdaki seçenekler yalnızca libtool için geçerlidir.

@file @ ile başlayan argümanlar, bu argümanları komut satırında listelemeye alternatif olarak belirtilen dosyadan okunan argümanlarla değiştirilir. Dosyalar basitçe boşluk karakterleriyle (boşluklar, sekmeler ve satır sonları) ayrılmış libtool seçeneklerini ve dosyalarını içerir. Boşluk karakterleri ve diğer ters eğik çizgiler dahil olmak üzere karakterler ters eğik çizgi () ile kaçışlandırılabilir. Ayrıca boşluk içeren argümanlar, tamamen veya kısmen tek veya çift tırnak karakterleri içine alınabilir. Bu dosyalar, ek dosyalara @file referansları içerebilir, ancak libtool içerme döngülerinde (include cycles) hata verecektir. Bir dosya bulunamazsa, orijinal @file argümanı argüman listesinde kalacaktır.

-static Girdi dosyalarından statik olarak bağlanmış (arşiv) bir kütüphane üretir. Varsayılan değer budur.

-encode_sdk_libraries_as_references Statik bir kütüphane oluştururken, bu seçenek komut satırında belirtilen ve SDK'de bulunan herhangi bir statik kütüphanenin, oluşturulmakta olan statik kütüphaneye dahil edilmesi yerine bir otomatik bağlantı (auto-link) ipucu olarak kodlanacağı anlamına gelir.

-ref-lname Bu seçenek, belirtilen kütüphane adı için otomatik bağlantı ipucunu kodlamak amacıyla -static ile birlikte kullanılır.

-ref-framework name Bu seçenek, belirtilen framework adı için bir otomatik bağlantı ipucunu kodlamak amacıyla -static ile birlikte kullanılır. Statik bir kütüphane oluştururken, bu seçenek iki veya daha fazla üye (nesne dosyaları) aynı yaprak ada (leaf name) sahipse bir uyarı verilmesini sağlar, çünkü arşiv bir dizine çıkarıldığında çakışırlar.

  • -V: libtool sürümünü yazdırır.

-filelist listfile[,dirname] listfile dosya adlarının bir listesini içerir ve komut satırında dosya adlarını belirtmenin alternatif bir yoludur. Dosya adları yalnızca satır sonlarıyla ayrılarak her satıra bir tane olacak şekilde listelenir (boşlukların ve sekmelerin dosya adının bir parçası olduğu varsayılır). İsteğe bağlı dizin adı dirname belirtilirse, liste dosyasındaki her adın başına eklenir.

-arch_only arch_type Bu seçenek libtool'un yalnızca belirtilen arch_type için bir kütüphane oluşturmasına neden olur ve girdi dosyalarındaki diğer tüm mimarileri yoksayar. Dinamik bir kütüphane oluştururken, bu seçenek aile cpusubtype dışındaki belirli bir cpusubtype ile belirtilirse, libtool ld(1) -force_cpusubtype_ALL bayrağını kullanmaz ve çıktının bu cpusubtype ile etiketlenmesi için -arch_only argümanını ld(1)'e -arch bayrağı olarak iletir.

Aşağıdaki seçenekler bir arşiv kütüphanesinin içindekiler tablosuyla ilgilidir ve hem libtool -static hem de ranlib için geçerlidir:

  • -s: Arşivle bağlantı kurarken daha hızlı bağlantı düzenlemeye olanak tanıyan tercih edilen içindekiler tablosu türünü üretir. İçindekiler tablosunun sırası sembol adına göre sıralanır. Bu tür içindekiler tablosunun kütüphane üye adı ``__.SYMDEF SORTED'' şeklindedir. Bu tür içindekiler tablosu yalnızca kütüphanede aynı sembolü tanımlayan birden fazla üye bulunmadığında üretilebilir. Varsayılan değer budur.

  • -a: Sırası arşivdeki üyelerin sırasına dayanan orijinal içindekiler tablosu türünü üretir. Bu tür içindekiler tablosunun kütüphane üye adı ``__.SYMDEF'' şeklindedir. Kütüphanede aynı sembolü tanımlayan birden fazla üye olduğunda bu tür içindekiler tablosu kullanılmalıdır.

  • -c: Ortak sembolleri içindekiler tablosuna göre tanımlar olarak dahil eder. Bağlantı oluşturma aşamasında o noktada tanımsız olan başlatılmamış bir küresel değişkeni kullandığı için bir kütüphane üyesinin bağlanmasını zorunlu kıldığından, bu durum bir kütüphaneden bağlantı oluşturma için nadiren istenen bir davranıştır. Bu seçenek yalnızca ranlib'in orijinal davranışı olduğu için dahil edilmiştir. Bu seçenek varsayılan değildir.

  • -L: Arşiv üye adlarının 16 karakterden uzun olmasına ve adlarında boşluk bulunmasına izin veren 4.4bsd arşiv genişletilmiş biçimi #1'i kullanır. Bu seçenek varsayılan değerdir.

  • -T: Arşiv üye adlarını 16 karaktere kısaltır ve 4.4bsd genişletilmiş biçimi #1'i kullanmaz. Bu seçenek varsayılan değildir.

  • -f: Çıktı arşivi evrensel olduğunda ve ar(1) artık üzerinde işlem yapamayacak hale geldiğinde uyarır.

  • -q: Evrensel bir dosya oluşturulacaksa hiçbir şey yapmaz.

  • -D: Statik bir kütüphane oluştururken, arşiv içeriğinin kullanıcı kimliklerini, grup kimliklerini, tarihlerini ve dosya modlarını makul varsayılan değerlere ayarlar. Bu durum, günün saatinden, kullanıcıdan, gruptan, umask'ten ve çevrenin diğer yönlerinden bağımsız olarak, aynı girdilerle oluşturulan kütüphanelerin birbirleriyle tamamen aynı olmasını sağlar.

Uyumluluk için, aşağıdaki ranlib seçeneği kabul edilir (ancak yoksayılır):

  • -t: Bu seçenek ranlib'in arşivleri değiştirmek yerine yalnızca ``dokunmasını'' (touch) talep etmek için kullanılırdı. Bu seçenek artık yoksayılmaktadır ve içindekiler tablosu yeniden oluşturulmaktadır.

Hem libtool hem de ranlib için geçerli olan diğer seçenekler:

  •  Geriye kalan tüm argümanları seçenek olarak değil, dosya (veya arşiv) adları olarak kabul eder.
    

-no_warning_for_no_symbols Sembolü olmayan dosyalar hakkında uyarı vermez.

-dependency_info path Başarılı bir derleme işlemini açıklayan bir Xcode bağımlılık bilgi dosyası yazar. Bu dosya, kütüphaneyi veya dylib'i oluşturmak için doğrudan veya dolaylı olarak kullanılan girdileri açıklar.

Ayrıca Bakınız

ld(1), ar(1), otool(1), make(1), ar(5)

Hatalar

Eski kütüphane oluşturma yöntemlerinde, kütüphane ar(1) ile değiştirildiğinde ve ranlib(1) yeniden çalıştırılarak içindekiler tablosu güncellenmediğinde hatalar oluşabiliyordu. Bu nedenle daha önce bağlantı düzenleyici ld(1), bir kütüphanenin değiştirilme tarihi, içindekiler tablosunun oluşturulma tarihinden daha yeni olduğunda bir hata üretiyordu. Ne yazık ki bu, kütüphaneyi yalnızca kopyalasanız bile hata alacağınız anlamına geliyordu. Bu hatanın çok fazla sıkıntıya yol açtığı görüldüğünden kaldırılmıştır. Dolayısıyla artık kütüphane değiştirilip içindekiler tablosu güncellenmediğinde bağlantı hataları almak yeniden mümkündür.

Apple Inc. February 6, 2025 LIBTOOL(1)