Отладка SWIG PHP расширение: неопределенный символ: _ZN15SplashOutputDev9updateAllEP8GfxState

#php #c #g #swig #poppler

#php #c #g #swig #poppler

Вопрос:

Я только что переустановил свой сервер, переключившись с Ubuntu 11.04 на 11.10 и с 32 на 64-разрядную версию. После этого я попытался переустановить свое пользовательское расширение SWIG PHP.

Я скомпилировал с

 swig -I/usr/local/include/poppler -Wall -php -c   popplig.i
g   -g -I. -I/usr/local/include/poppler -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -fpic -c popplig_wrap.cpp ExtensibleOutputDev.cc PDFFont.cc HtmlLinks.cc PDFImage.cc MarkedContentState.cc Error.cc
g   -Wall -Wextra -g -lpoppler -shared popplig_wrap.o ExtensibleOutputDev.o PDFFont.o HtmlLinks.o PDFImage.o MarkedContentState.o Error.o -o popplig.so
  

Связывание завершается без ошибок или предупреждений.

Но когда я запускаю php, я получаю

 $ php -r ""
PHP Warning:  PHP Startup: Unable to load dynamic library '/atlas/www/txtbear/poppler-swig/popplig.so' - /atlas/www/txtbear/poppler-swig/popplig.so: undefined symbol: _ZN15SplashOutputDev9updateAllEP8GfxState in Unknown on line 0
  

Этот символ определен в моей копии libpoppler

 $ nm -g /usr/local/lib/libpoppler.so | grep _ZN15SplashOutputDev9updateAllEP8GfxState
0000000000141370 T _ZN15SplashOutputDev9updateAllEP8GfxState
  

ld знает о poppler

 $ sudo ldconfig -v | grep poppler
    libpoppler-cpp.so.0 -> libpoppler-cpp.so.0.1.0
    libpoppler.so.6 -> libpoppler.so.6.0.0
    libpoppler.so.6 -> libpoppler.so.6.0.0
    libpoppler-glib.so.6 -> libpoppler-glib.so.6.0.0
  

Но мое расширение, похоже, не связано с ним (несмотря на -lpoppler )

 $ ldd popplig.so
    linux-vdso.so.1 =>  (0x00007fffbd079000)
    libstdc  .so.6 => /usr/lib/x86_64-linux-gnu/libstdc  .so.6 (0x00007fa104957000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa1046d3000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa1044bc000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa10411d000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa10502b000)
  

Похоже, проблема заключается в том, что g не связан с libpoppler. Как я могу узнать, что происходит не так со связыванием?

Комментарии:

1. Что file /usr/local/lib/libpoppler.so говорит? Также ldd /usr/local/lib/libpoppler.so может помочь.

Ответ №1:

g -Wall -Wextra -g -lpoppler -shared popplig_wrap.o...

Эта командная строка неверна: предполагается, что библиотеки должны следовать объектам, которые их используют в строке ссылки. Посмотрите, приведет ли переход -lpoppler к концу строки ссылки

  1. Сделайте так, чтобы он отображался в ldd popplig.so и
  2. Исправлена неразрешенная проблема с символом.