Paylaşılan kitaplığımda, yükleme zamanında belirli bir başlatma yapmam gerekiyor. Bu işlevi GCC özniteliği __attribute__ ((constructor))
ile tanımladım, çalışmaz, yani paylaşılan kitaplığımı bağlayan program yüklendiğinde çağrılmaz.paylaşılan kütüphane kurucusu çalışmıyor
İşlev adını _init()
olarak değiştirirseniz, çalışır. Görünüşe göre, _init()
ve _fini()
işlevlerinin kullanımı şu anda not recommended.
Neden __attribute__ ((constructor))
işe yaramaz? Bu Linux 2.6.9, gcc
versiyonu ile 3.4.6
Düzenleme: .bu bina için
#include <stdio.h>
int smlib_count;
void __attribute__ ((constructor)) setup(void) {
smlib_count = 100;
printf("smlib_count starting at %d\n", smlib_count);
}
void smlib_count_incr() {
smlib_count++;
smlib_count++;
}
int smlib_count_get() {
return smlib_count;
}
: Örneğin
, kütüphane kod aşağıdaki gibi olduğunu varsayalım .bu standart konumlarda bengüncellemek birinde olmadığından
gcc -fPIC -c smlib.c
ld -shared -soname libsmlib.so.1 -o libsmlib.so.1.0 -lc smlib.o
ldconfig -v -n .
ln -sf libsmlib.so.1 libsmlib.so
: Ben aşağıdakileri yapınve .so'yu başka bir programdan bağlayın. Kurucu aramıyor. _init()
olarak değiştirirseniz, çalışır.
Bu alakalıdır. Seninki nerede? Benim gibi çalışan bir tane var: void __attribute__ ((constructor)) constructor() {...} '. 'Void' ve constructor() 'dan sonra olduğunu unutmayın. –
Sorumun cevabı değil, ancak paylaşımlı kütüphane kurucular genellikle * sebebiyle karışıklık main' girilir 'önce programın başlangıç durumu kabiliyetlerine * Zararlı Sayılan dikkati çekiyor. Daha sonra ALSA cihazı kendisinin açılması uygulamanın engelleyen bir şekilde ALSA kütüphanesi/cihaz durumu ile munged (I sabit ama emin değilim çünkü inanıyoruz en az bir zamanda) ve en az bilinen, örneğin OpenAL'in vardır. Uygun kütüphaneler, herhangi bir küresel duruma sahip olmaktan kaçınmak için ellerinden gelenin en iyisini yapmalı ve eğer gerekli ise, ilk kütüphane çağrısında temsili başlatmayı kullanmalıdır. –
@Dan Fego, Yukarıda önerdiğiniz gibi farklı yerleşimler denedim. Hala çalışmıyor. – Manohar