2010-05-04 16 views
13

Projemizi derlerken, her biri y_function() ve z_function() işlevlerini tanımlayan bir nesne dosyası içeren liby.a ve libz.a gibi çeşitli arşivler (statik kitaplıklar) oluştururuz. Ardından, bu arşivler paylaşılan bir nesnede, yani ana dağıtılabilir hedefimiz olan libyz.so'da birleştirilir. Bir arşivin tüm nesneleri paylaşılan bir nesneye nasıl eklenir?

g++ -fPIC -c -o y.o y.cpp 
ar cr liby.a y.o 
g++ -fPIC -c -o z.o z.cpp 
ar cr libz.a z.o 
g++ -shared -L. -ly -lz -o libyz.so 

örnek programına bu paylaşılan nesne kullanarak

, x.c demek, bağlantı nedeniyle fonksiyonlar y_function() ve z_function() için tanımlanmamış bir referansların başarısız olur.

g++ x.o -L. -lyz -o xyz 

Ancak, son yürütülebilir dosyayı doğrudan arşivlerle (statik kitaplıklar) ilişkilendirdiğimde çalışır.

g++ x.o -L. -ly -lz -o xyz 

Benim tahminim arşivlerde bulunan nesne dosyaları onlar kullanılmaz çünkü değil paylaşılan kitaplığa bağlantılı olmasıdır. Kaynaştırma nasıl zorlanır?

Düzenleme:

İçerme --whole-arşivi ld seçeneği kullanılarak zorlanabilir. Ancak derleme hatalarıyla sonuçlanırsa:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so 
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x1d): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 

Bunun nereden kaynaklandığını biliyor musunuz?

cevap

18

Sen deneyebilirsiniz (ld (2)):

--whole-archive 
     For each archive mentioned on the command line after the --whole-archive option, include every object file in the 
     archive in the link, rather than searching the archive for the required object files. This is normally used to turn 
     an archive file into a shared library, forcing every object to be included in the resulting shared library. This 
     option may be used more than once. 

(gcc -Wl, - tam arşiv)

Artı, kütüphane listesinin sonunda -Wl,--no-whole-archive koymak gerekir.

+0

teşekkür (Dimitri aşağıda açıklamada Yudakov söylediği gibi), bu benim aradığım şey gibi görünüyor, ama buna nereden geldiğini bilemiyorum bir bağlantı hatası üretir. Soruya detaylar ekledim. –

+2

, bu seçenek için 'man ld' içinde importnat notu var: Arşivler listenizden sonra -Wl, -no-all-arşivi kullanmayı unutmayın; çünkü gcc, kendi arşivler listenizi linkinize ekleyecektir. Bu bayrağı da bunları etkilemek istiyor –

İlgili konular