[cairo] py2cairo - 'import cairo' fails with linking error

Jay Hendren james.hendren at Colorado.EDU
Thu Mar 27 11:01:50 PDT 2014


I have managed to figure out this problem.

It turns out that some dependencies of dependencies of cairo,
in particular the system install of libXft, were pulling in system
libfreetype libraries from /usr/lib64.  The system libfreetype libraries
do not define FT_Library_SetLcdFilter, but the linker won't pull in both
/usr/local/freetype/lib/libfreetype.so.6 and /usr/lib64/libfreetype.so.6,
so FT_Library_SetLcdFilter was never defined in the loaded shared
libraries.

Fixing this would require rebuilding all dependencies of cairo
that also depend on libXft all the way up the tree back to cairo
itself, which is infeasible.  The best solution is to simply "export
LD_LIBRARY_PATH=/usr/local/freetype/lib" in order to use the custom
builds of cairo and pycairo.

I hope this helps somebody else in the future.

Regards,

Jay

> I'm attempting to install py2cairo on top of local builds of python,
> cairo, freetype, and a whole slew of other dependencies.  I was able
> to successfully compile py2cairo and it appears to be properly linked
> with all necessary shared object files.  But when I try to use py2cairo,
> I get a linker error:
> 
>     [arlsrv2 ~]% which python
>     /usr/local/python/bin/python
>     [arlsrv2 ~]% python
>     Python 2.7.1 (r271, Jun 14 2011, 11:40:39) 
>     [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
>     Type "help", "copyright", "credits" or "license" for more information.
>     >>> import cairo
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>       File "/usr/local/py2cairo/lib/python2.7/site-packages/cairo/__init__.py", line 1, in <module>
>         from _cairo import *
>     ImportError: /usr/local/cairo-1.12.16/lib/libcairo.so.2: undefined symbol: FT_Library_SetLcdFilter
> 
> Cairo is complaining about the freetype library, which it links against.
> Support for the LCD filter is not built into the system freetype library,
> but it is build into my local build of the freetype library.
> 
> If I run ldd against the cairo library that the python importer is
> complaining about, I can see that it appears to be linked properly to
> my custom freetype build in /usr/local:
> 
>     [arlsrv2 ~]% ldd /usr/local/cairo-1.12.16/lib/libcairo.so.2
>     	linux-vdso.so.1 =>  (0x00007fff779fd000)
>     	libpixman-1.so.0 => /usr/local/pixman-0.29.4/lib/libpixman-1.so.0 (0x00002aef7aa52000)
>     	libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00002aef7ad2d000)
>     	libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00002aef7af61000)
>     	libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00002aef7b185000)
>     	libX11.so.6 => /usr/lib64/libX11.so.6 (0x00002aef7b38f000)
>     	libXext.so.6 => /usr/lib64/libXext.so.6 (0x00002aef7b69b000)
>     	libz.so.1 => /lib64/libz.so.1 (0x00002aef7b8ac000)
>     	librt.so.1 => /lib64/librt.so.1 (0x00002aef7bac1000)
>     	libfreetype.so.6 => /usr/local/freetype-2.4.12/lib/libfreetype.so.6 (0x00002aef7bcca000)
>     	libm.so.6 => /lib64/libm.so.6 (0x00002aef7bf58000)
>     	libc.so.6 => /lib64/libc.so.6 (0x00002aef7c1dc000)
>     	/lib64/ld-linux-x86-64.so.2 (0x0000003726200000)
>     	libexpat.so.0 => /lib64/libexpat.so.0 (0x00002aef7c535000)
>     	libXau.so.6 => /usr/lib64/libXau.so.6 (0x00002aef7c758000)
>     	libXdmcp.so.6 => /usr/lib64/libXdmcp.so.6 (0x00002aef7c95b000)
>     	libdl.so.2 => /lib64/libdl.so.2 (0x00002aef7cb60000)
>     	libpthread.so.0 => /lib64/libpthread.so.0 (0x00002aef7cd64000)
>     	libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00002aef7cf81000)
>     [arlsrv2 ~]%
> 
> If I add the directory containing my local libfreetype to my run-time library search path, linking succeeds:
> 
>     [arlsrv2 ~]% export LD_LIBRARY_PATH=/usr/local/freetype-2.4.12/lib
>     [arlsrv2 ~]% python
>     Python 2.7.1 (r271, Jun 14 2011, 11:40:39) 
>     [GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2
>     Type "help", "copyright", "credits" or "license" for more information.
>     >>> import cairo
>     >>> 
> 
> Based on the evidence at hand, it would appear that the run-time linker
> is somehow not searching the right path from within the python importer.
> 
> I've done my best to fix this, but I'm stymied - cairo was compiled with
> -Wl,-rpath=/usr/local/freetype-2.4.12/lib , so the linker should be using
> an absolute path rather than a library name in order to locate the
> freetype library.
> 
> Any help fixing this would be immensely appreciated.
> 
> Thanks,
> 
> Jay
> -- 
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list