2011-01-05 21 views
56

Sadece matematik kütüphanesinden bir işlevi ifade eden bir programı derlemek için gcc tarafından -lm bayrağının gerekli olduğunu keşfettim. Zaman kitaplığı gibi diğer kütüphaneleri içeren programları derlerken neden açık bir bağlantı bayrağı gerektiğine merak ediyorum. time() işlevinin çağrıldığı bir program yazarsam, hiçbir bağlantı seçeneğiyle bile sorunsuz bir şekilde derlerdi. Ama matematik kütüphanesi içeren bir program sadece -lm bayrağı olmadan çalışmayacaktır.gcc: matematik kütüphanesini bağlamak için neden -lm bayrağı gerekiyor?

Bu davranışın ardındaki nedenini açıklayan herhangi biri olabilir mi? Zaman ayırdığın için teşekkürler. time() ve diğer bazı fonksiyonlar kendisi ve GCC hep bağlantılar sürece libc C kütüphanesinde (libc) tanımlanan builtin Çünkü

+4

Garip tarihsel nedenler, ancak çoğunlukla bunun nedeni şu şekildedir: http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c – birryree

cevap

32

Eğer -ffreestanding derleme seçeneğini kullanın. Ancak, matematik işlevleri, gcc tarafından dolaylı olarak bağlanmayan libm'da yaşar.

+4

Açık LLVM gcc -lm eklemek zorunda değilim. Bu neden? –

55

Kimsenin düzeltmek istemediği gülünç tarihsel uygulamalardan dolayı. C ve POSIX tarafından istenen tüm fonksiyonların tek bir kütüphane dosyasına birleştirilmesi, sadece bu soruyu tekrar tekrar ele almaktan kaçınmakla kalmayacak, aynı zamanda dinamik bağlantı kurulduğunda da önemli miktarda zaman ve bellek tasarrufu sağlayacaktır, çünkü her bir .so dosya bağlantılı dosya sistemini gerektirir. operasyonlar (bulmak ve onu bulmak, vb vb onun statik değişkenler, tehcir,

tüm fonksiyonlar tek bir kütüphanede bulunmaktadır

bir uygulama ve -lm, -lpthread, -lrt, birkaç sayfa seçenekleri tüm no-op vardır için veya boş .a dosyalarına link) mükemmel POSIX uyumludur ve kesinlikle tercih edilir.

Not: POSIX hakkında konuşuyorum çünkü C kendisi derleyicinin nasıl çağrıldığı hakkında hiçbir şey belirtmiyor. Böylece, gcc -std=c99 -lm'u, derleyicinin uyumlu davranış için çağrılması gereken uygulamaya özel bir yol olarak davranabilirsiniz.

+8

+1, POSIX'in ayrılan libm, libc ve librt kitaplıklarının var olmadığını belirtmek için +1. Örnek olarak, Mac OS'de her şey tek bir libSystem'de bulunur (libdbm, libdl, libgcc_s, libinfo, libm, libpoll, libproc ve librpcsvc içerir). –

+3

–1 bir kitaplık veya numara ile yedeklemeden, performansın kitaplık üzerindeki etkilenme etkisinin belirlenmesi için. "Profile. Spekülasyon yapmayın" –

+7

Bu spekülasyon değildir. Yayınlanmış bir makalem yok ama tüm ölçümleri kendim yaptım ve fark çok büyük. Dinamik bağlantıya ne kadar başlangıç ​​süresinin harcanacağını izlemek için zamanlama seçeneklerinden birini kullanarak 'strace'ı kullanın ya da tüm standart yardımcı programların dinamik olduklarına karşı statik bağlantıya sahip olduğu bir sistemde'./Configure' çalıştırmayı karşılaştırın. -bağlantıh. Ana masaüstü uygulama geliştiricileri ve sistem entegratörleri bile dinamik bağlantı maliyetlerinin farkındadır; Prelink gibi şeyler bu yüzden var. Eminim bu makalelerin bazılarında karşılaştırmalar bulabilirsiniz. –

İlgili konular