[pylucene-dev] Re: experiences with --shared on Linux

Andi Vajda vajda at osafoundation.org
Tue Mar 11 16:27:34 PDT 2008


On Tue, 11 Mar 2008, Bill Janssen wrote:

>>     - a libjcc.dylib shared library
>>       To build this, simply enter this in the shell after building JCC
>>       itself (on leopard intel mac, adapt for other platforms until I
>>       automate this in JCC's setup.py)
>>
>> g++ -dynamiclib -install_name /Library/Python/2.5/site-packages/JCC-1.8-py2.5-macosx-10.5-i386.egg/jcc/libjcc.dylib -o libjcc.dylib build/temp.macosx-10.5-i386-2.5/jcc/sources/jcc.o build/temp.macosx-10.5-i386-2.5/jcc/sources/JCCEnv.o -undefined dynamic_lookup
>> cp -p libjcc.dylib /Library/Python/2.5/site-packages/JCC-1.8-py2.5-macosx-10.5-i386.egg/jcc/
>
> So, I built this on Linux with
>
>  % g++ -shared -o libjcc.so ./build/temp.linux-i686-2.5/jcc/sources/jcc.o ./build/temp.linux-i686-2.5/jcc/sources/JCCEnv.o
>
>  % sudo cp -p libjcc.so /usr/lib/python2.5/site-packages/JCC-1.8-py2.5-linux-i686.egg/jcc/
>
> Then, I rebuilt PyLucene with the --shared switch and installed it.
>
> When I try to start it up, I get
>
> % python
> Python 2.5 (r25:51908, Apr 10 2007, 10:29:13)
> [GCC 4.1.2 20070403 (Red Hat 4.1.2-8)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> import lucene
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
>  File "/usr/lib/python2.5/site-packages/lucene-2.3.1-py2.5-linux-i686.egg/lucene/__init__.py", line 2, in <module>
>    import os, _lucene
> ImportError: libjcc.so: cannot open shared object file: No such file or directory
>>>>
> %
>
> If I'm reading the JCC Python code correctly, the shared library
> should be installed in the same directory where _jcc.so is installed,
> and should have the name "libjcc.<shext>", where <shext> is the shared
> library extension for the platform.  Is that correct?  If so, I'm not
> sure why I'm seeing this error, because
>
> % ls /usr/lib/python2.5/site-packages/JCC-1.8-py2.5-linux-i686.egg/jcc/
> config.py   cpp.pyc	  _jcc.py   libjcc.so	   python.py
> config.pyc  __init__.py   _jcc.pyc  libjcc.so.1    python.pyc
> cpp.py	    __init__.pyc  _jcc.so   libjcc.so.1.8  sources
> %
>
> I do not have LD_LIBRARY_PATH set.  When I do set it, things work.
> Apparently on this platform, the thing to do is to somehow tell the
> lucene extension where the JCC shared library is supposed to be, and
> have that put on the load path.  I believe the correct way to do this
> is to use the "-rpath" flag to the linker when building _lucene.so.

Yes, that's the answer to your question. On Linux, you need to use -rpath to 
get the _lucene.so to find libjcc.so or set LD_LIBRARY_PATH.
You can include that in the LFLAGS in JCC's setup.py.
(just like is done for libjava.so)

Andi..


More information about the pylucene-dev mailing list