2009-08-20 17 views
6

Kodumu lib öneki olmadan paylaşılan bir kütüphaneye bağlamanız gerekir. (diyelim, foo.so) İlk sorun, -l seçeneği dosyayı bulamıyor. Bu yüzden doğrudan böyle son derleme için bu dosyanın da dahil çalıştı:Farklı bir dizinde lib * öneki olmayan bir paylaşılan kitaplığa nasıl bağlanır?

gcc bir ao /PATH/TO/FOO/foo.so

Ancak bu durumda, sert bir şekilde foo.so bağlantılı olduğu "ldd a" de görüldüğü gibi mutlak yol:

/PATH/TO/FOO/foo.so

hem dosyalar aynı klasörde olmak sona ereceğini nihai dağıtım içinde

, bu nedenle bu normal bir bağlantı olmalıdır mutlak yol değil. Bunu nasıl yapabilirim?

+0

Olası kopyalar [Nasıl -l olmadan GCC kullanarak bağlamak için ne libNAME.so adlandırma kurallarına uymayan bir kitaplık için sabit kodlama yolu nedir?] (http://stackoverflow.com/questions/207069/how-to-link-using-gcc-without-l-nor-hardcoding-path-) için-a-kütüphanede-o-does not –

cevap

6

-Wl, -rpath ,. -> lib dosyalarını aramak için geçerli dizini kullanmak. (derlemede bulunmasa bile, çalışma zamanında tamam) yerine -llibrary -> library.so kullanın.

Bu, düzgün çalışıyor gibi görünüyor. Umarım bunu yararlı bulur. Eğer foo.so yeniden eğer

12

, bir ELF platformu varsayarsak:
- En iyi düzeltme basitçe o libfoo.so
isim olduğunu - sonraki en iyi düzeltme üzerinde SONAME ayarlamaktır:

gcc -Wl,-soname,foo.so -o foo.so foo.o 

seni

gcc -o a.out a.o /path/to/foo.so 

sadece SONAME bir bağımlılık değil, tamolarak kaydedilecektir: daha sonra bağlantı. Eğer foo.so yeniden yapamıyorsanız

, o zaman bu yapın:

rm -f foo.so && ln -s /path/to/foo.so foo.so && 
    gcc -o a.out a.o ./foo.so && rm -f foo.so 
İlgili konular