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?
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. –
, 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 –