[Gelistirici] PyGObject'te Undefined Symbols

Ozan Çağlayan ozan at pardus.org.tr
22 Mayıs 2009 Cum 00:32:15 EEST


Gökmen Görgen wrote:
> 2009/5/21 Ozan Çağlayan <ozan at pardus.org.tr <mailto:ozan at pardus.org.tr>>
>
>     Çözüm, makefile.am <http://makefile.am> veya makefile.in
>     <http://makefile.in> dosyalarında ilgili
>     değişikliği(likleri) yaparak bahsi geçen kütüphanenin linklenmesi
>     esnasında, undefined symbolleri sağlayan kütüphaneye de linklenmesini
>     sağlamak.
>
>
> Cevaplarin icin cok tesekkurler. Yaptigim yamadan hic mi hicbir sey
> anlamadim ama senin dediklerinden ve gosterdigin orneklerden anladigim
> kadariyla birseyler yapmaya calistim ve gercekten ise yaradi. Bununla
> beraber, paketciler icin pisi.conf'a --no-undefined parametresinin
> eklenmesinin de gercekten faydasi olacagini dusunuyorum, boylece bu
> bozuk insanin gozden kacmasi imkansiz oluyor, cunku paketlenmiyor bile.
>

Faydalı olabilirdi baştan as-needed'ı eklerken akıl etsek ama artık
biraz geç kaldık bence, bir de 10 paketin 5inde patlıyor, tecrübesiz
paketçileri oldukça yavaşlatabilir. Dediğin gibi hata açıp altına
girebiliriz.

Ya da devel/ altında dosya olarak commit edelim, daha hızlı ve
interaktif olabilir öyle.

Ben bir betik yazıp farm'da çalıştırıp undefined symbol görünen
paketlerin listesini çıkartırım.

Bu arada yaptığın yamada doğrudan -lpython2.6 yazmak yerine
python-config --libs komutunun çıktısını yazabilirsin. Bunun için
backtick arasına koyman yeterli komutu:

hedehodo_LDFLAGS += hede hodo foo bar `python-config --libs`

gibi. Sürüm bağımsız olmuş olur ve ihtiyaç duyulabilecek diğer
kütüphaneleri de getirir. Gereksiz olanları as-needed zaten kaale
almayacaktır.


Bu arada as-needed'ın da işini doğru yapabilmesi için linking order'ın
düzgün olması lazım. Baktınız ki halen unused deps var bir kütüphanede,
yine makefile'lara dalarak sırayı değiştirip denerseniz büyük ihtimalle
düzelecektir:

gcc (CFLAGS ve LDFLAGS) (*.o ve varsa *.a dosyaları) -lkütüphane1
-lkütüphane2 -lkütüphane3 -lkütüphaneN -o çıktıdosyası

Doğru örnek:

$ gcc -Wl,--as-needed someunit1.o someunit2.o -lm -o program

Yanlış örnek:

$ gcc -Wl,--as-needed -lm someunit1.o someunit2.o -o program
 


Bazı paketlerde abuk subuk sıralarla çağırılıyor libtool bu yüzden
unused deps kalabiliyor. Yine depoda

find -name "*linking-order*"

diye ararsanız çeşitli yamalar bulabilirsiniz.



Gelistirici mesaj listesiyle ilgili daha fazla bilgi