2010-03-29 25 views
5

Aşağıdaki iki yoldan kütüphanelerin (hem paylaşılan hem de statik) gcc/g ++ belirtilmesinde önemli bir fark olup olmadığını anlamak isterim (CC g ++ veya gcc olabilir)Kütüphaneleri gcc/g ++ 'da belirtmenin farklı yolları

CC -o output_executable /path/to/my/libstatic.a /path/to/my/libshared.so source1.cpp source2.cpp ... sourceN.cpp 

vs

CC -o output_executable -L/path/to/my/libs -lstatic -lshared source1.cpp source2.cpp ... sourceN.cpp 
şey

sadece doğrudan tam belirtilen kitaplık adı geçen statik veya dinamik versiyonlarını seçiminde daha büyük bir kontrol için vereceğini olmanın önemli bir farkı görebilirsiniz, ama ben şüpheli var Bunun üzerine devam eden nasıl execu üzerinde yan etkileri olabilir Tablo yürütülür veya çalışma zamanında davranacak, doğru muyum?

Andrea.

+0

Her ikisini de denediniz ve elde edilen yürütülebilir dosyaları karşılaştırdınız mı? – Ernelli

+0

Gerçekten değil. Bir sonraki testim olabilir, ancak bu – abigagli

cevap

5

Tamam, kendimi bazı deneylere dayanarak cevaplamak ve gcc belgelerin daha derin okuma yapabilirsiniz: gcc belgelerine

: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

[...] bağlayıcı tarama yaparak arşiv dosyası kolları Şimdiye kadar tanımlanmış fakat tanımlanmamış olan sembolleri tanımlayan üyeler için. Ancak, bulunan dosya sıradan bir nesne dosyasıysa, normal şekilde bağlanır. Bir -l seçeneğini kullanarak ve bir dosya adı belirterek arasındaki tek fark -l Bu aslında doğrudan belirterek 3'üncü seçeneği hakkında ilgili şüphe da cevap birkaç dizinleri

lib' and .a ile kütüphane çevreleyen' ve arar olmasıdır Gcc komut satırındaki nesne dosyaları (yani, bu durumda nesne dosyalarındaki tüm kodlar, son çalıştırılabilir dosyanın bir parçası olacaktır, arşivleri kullanırken, yalnızca gerçekten ihtiyaç duyulan nesne dosyaları çekilecektir).

+0

ile ilgili bazı "resmi" bilgiler olup olmadığını görmek isterim .so tam yol kullanırken .so - çalışma zamanında farklı bir ortamda ne olur? nasıl gözüküyor? Görünüşe göre, 'tüm dizgeyi bir kütüphane olarak arıyor, dolayısıyla hedef ortamdaki orijinal tam yerinde bulunmuyorsa - bulamazsınız .. nasıl aşmalıyız? –

+1

Normalde, .so bir "soname" (yani büyük bir sürüm numarası ekleyerek kütüphane adı) içeriyorsa, "soname", yürütülebilir dosyaya bir bağımlılık olarak kayıtlı olmasıdır. Daha sonra, çalıştırıcıyı başlatırken, çalışma zamanı linker (genellikle linux/lib/ld-linux.so.X), çeşitli konumlarda (platform tarafından belirlenen LD_LIBRARY_PATH ortam değişkeni ve potansiyel olarak bina sırasında kullanılan rpath argümanı) görünecektir. Soname (genellikle dosya sistemi üzerinde .so gerçek adı için bir bağlantıdır). Ayrıca bkz. Http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html – abigagli

+0

Teşekkürler! Kendimi birkaç saat önce keşfettim soname ve rpath :) –