【问题标题】:Debugging SWIG PHP extension: undefined symbol: _ZN15SplashOutputDev9updateAllEP8GfxState调试 SWIG PHP 扩展:未定义符号:_ZN15SplashOutputDev9updateAllEP8GfxState
【发布时间】:2011-10-23 20:27:09
【问题描述】:

我刚刚重新安装了我的服务器,从 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

我知道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。如何找出链接出了什么问题?

【问题讨论】:

  • file /usr/local/lib/libpoppler.so 说什么? ldd /usr/local/lib/libpoppler.so 也可能会有所帮助。

标签: php c++ g++ swig poppler


【解决方案1】:

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

此命令行不正确:库应该跟随在链接行上使用它们的对象。看看是否将-lpoppler移动到链接行的末尾

  1. 让它显示在ldd popplig.so
  2. 修复未解决的符号问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多