2012-04-30 31 views
7

ben bir PHP uzantısı SWIG kullanılarak yapılan yüklemeye çalışıyorum yapılan php uzantısı yükleme, ancak PHP başlatırken aşağıdaki hatayı alıyorum zaman:Tanımsız sembol yudum

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/libtg.so' - /usr/lib/php5/20090626/libtg.so: undefined symbol: __gxx_personality_v0 in Unknown on line 0 

Ben yüklemeye çalışıyorum uzantısıdır libtg.so adlandırılır ve komutuyla derlendi: libtg_wrap.o yudum tarafından oluşturulan sarıcı kodu için nesne dosyasıdır

g++ -shared libtg_wrap.o -o libtg.so 

.

eksik sembol __gxx_personality_v0 aşağıdaki komutu de anlaşılacağı üzere, libstdc++.so bulunur: böylece

$ ldd libtg.so 
linux-vdso.so.1 => (0x00007fff5f932000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3fc937c000) 
libm.so.6 => /lib/libm.so.6 (0x00007f3fc90f9000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f3fc8ee2000) 
libc.so.6 => /lib/libc.so.6 (0x00007f3fc8b5f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f3fc98fc000) 

ı don:

$ nm -D /usr/lib/libstdc++.so.6 | grep __gxx_personality_v0 
00000000000b9990 T __gxx_personality_v0 

libstdc++.so aşağıdaki komutu de anlaşılacağı üzere, libtg.so başvuruluyor Sembolü neden bulamadığını görüyorum. Bunu daha fazla hata ayıklama konusunda herhangi bir fikrin var mı?

cevap

1

Derleme işleminizde bir yerde, derleyici veya bağlayıcı bir C++ kaynağının farkında değildi.

Swig'i denediğimde (ayrıca bir php uzantısı oluşturmak için), sizin durumunuzda kullanışlı olabilecek aşağıdaki Makefile'u yarattım, böylece projeniz için bunu özelleştirmek ve denemek isteyebilirsiniz, bu oldukça zor.

Swig komutuna "-C++" seçeneğini nasıl belirteceğimi görün. Ayrıca, kaynak dosyalarınız için .cpp uzantılı olduğundan emin olun ve linker bayraklarınıza "-lstdC++" ekleyin.

${OUTPUTDIR}/${NAME}_swig.cpp: 
    ${SWIG} -outdir ${OUTPUTDIR} \ 
     -oh ${OUTPUTDIR}/${NAME}_swig.h \ 
     -o ${OUTPUTDIR}/${NAME}_swig.cpp \ 
     -c++ -php \ 
     ${NAME}.i 

ve bağlayıcı çağırma (-lstdc bayrağı dikkat edin):

ld -shared ${OUTPUTDIR}/*.o -o ${OUTPUTDIR}/${NAME}.so -lstdc++ 

o

yardımcı Umut

önemli şeyler yudum çağırmayı (-C++ seçeneği unutmayın) olmalıdır

+0

İlginç bir şekilde, işe yaradı! Önceden 'g ++' yerine 'ld' yerine doğrudan bağlantı kuruyordum… Farkın ne olduğunu merak ediyorum. – HighCommander4

+0

Aslında, bir fark olmamalı, g ++ kullanarak bağlantı kurabilirsiniz. .o dosyasını nasıl derlediğinizi veya swig komutunu veya diğer ayrıntıları nasıl çağırdığınızı göstermediğiniz için çok fazla şey söyleyemem .. ama işe yaradığıma sevindim! :) – marcelog

+0

.o dosyası 'g ++ \' php-config5 --includes \ '-c -fPIC -std = C++ 0x libtg_wrap.cpp' ile derlenmiş ve swig komutu' swig -php - olarak çağrılmıştır. C++ libtg.i'. – HighCommander4