2011-12-03 21 views
8

Oluşturduğum bir kütüphaneyi dinamik olarak bağlamalıyım. Sorun ne olduğundan emin değilim. Her şey düzgün derler, ama her zaman NULL işaretçi olarak handle yakalamak:Uygun kullanımlı libdl ve dinamik olarak bağlantılı kütüphaneler

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

bu hatayı geçmiş olsun olamaz ve ben muhtemelen yanlış olabilir emin değilim. Eminim herşeyi doğru bir şekilde derledim. İşte kullanılan derleme adımları şunlardır: Sadece ET_DYN ve ET_EXEC yüklenebilir

okur bir hata alıyorum

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

.

cevap

14

hw11-lib-michaelSchilling.so bina, size bir paylaşılan nesne istiyorum gcc anlatacağız görünmüyor (adına .so yeterli değildir). o bir nesne dosyası üretiyor -c ile

ve onu michaelSchilling.so çağırarak (bir nesne ortak). Bağlayıcı bile çağrılmıyor.

-sharedgcc komut satırından -c çıkarıp ekleyin:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

'-rdynamic' ile birlikte mi? Sadece hem ile hem de "-shared" ile denedim, ama aynı hatayı aldım. –

+0

@MichaelSchilling: Sanırım '-dinamik' sorunla ilgili bir şey yok, bu yüzden kodunuzun ihtiyaç duyması durumunda onu saklayabilirsiniz. – NPE

+0

@MichaelSchilling: "-c" yi kaldırdınız mı? – NPE

0

Dosya sisteminizin mutlak kökünde hw11-lib-michaelSchilling.so mu? Bunun bir eğik çizgi olduğunu iddia ediyorsun ... ... ama sanmıyorum.

Hata işleme sırasında, hata nedenini bulmak için yazdırdığınız öğeye dlerror() çıktısını ekleyin.

+0

hw11 gerek -lib-michaelSchilling.so: paylaşılan nesne dosyasını açamıyor: Böyle bir dosya veya dizin yok Bu hatayı aldığımdan, ancak çalıştırmaya çalıştığım programla aynı dizini. Ayrıca eğik çizgiyi de kaldırdım. –

+0

Yardımcı olup olmadığını görmek için paylaşılan nesneye tam mutlak yol sağlamayı deneyin. – mah

+0

Yaptım ve sadece ET_DYN ve ET_EXEC yüklenebilir. –

1

Bir yol adının ilk karakteri olarak bir eğik çizgi (/), yol adının geçerli çalışma dizinine göre değil ve kesinlikle ikili konumun konumuna göre değil mutlak (kök dizine göre) olduğunu gösterir. İkilinin yerini belirleyerek tam yolunu belirtmeniz gerekir (ki bu kendi başına kolay bir problem değildir) veya $ORIGIN'u dlopen ile kullanabilirsiniz (rpath ile çalışır, ancak çalışıp çalışmadığından emin değilim) dlopen ile).

+0

Yoldan önceki bir süreye ne dersiniz? ('. /') –

+0

Bu, geçerli çalışma dizinine göre, programınızın ikili konumuna göre değil. –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

eser Linux üzerinde benim için açar kodu için kütüphane derlerken, sen -ldl

İlgili konular