python extensions: including project local headers

Philip Semanchuk philip at semanchuk.com
Thu Oct 23 17:13:56 EDT 2008


On Oct 23, 2008, at 3:18 PM, J Kenneth King wrote:

> Philip Semanchuk <philip at semanchuk.com> writes:
>
>> On Oct 23, 2008, at 11:36 AM, J Kenneth King wrote:
>>
>>>
>>> Hey everyone,
>>>
>>> I'm working on a python extension wrapper around Rob Hess'
>>> implementation of a SIFT feature detector. I'm working on a
>>> computer-vision based project that requires interfacing with  
>>> Python at
>>> the higher layers, so I figured the best way to handle this would be
>>> in
>>> C (since my initial implementation in python was ungodly and slow).
>>>
>>> I can get distutils to compile the extension and install it in the
>>> python path, but when I go to import it I get the wonderful  
>>> exception:
>>>
>>> ImportError: /usr/lib/python2.5/site-packages/pysift.so: undefined
>>> symbol: _sift_features
>>
>>
>> Kenneth,
>> You're close but not interpreting the error quite correctly. This
>> isn't an error from the compiler or preprocessor, it's a library
>> error. Assuming this is dynamically linked, your OS is reporting  
>> that,
>> at runtime, it can't find the library that contains _sift_features.
>> Make sure that it's somewhere where your OS can find it.
>
> This is basically what I was looking for help with. So far the project
> directory is:
>
> /pysift
>  /sift
>    ..
>    /include
>      ..
>      sift.h
>    /src
>      ..
>      sift.c
>  /src
>    pysift.c
>  setup.py
>
> I thought I could just #include "sift.h" in pysift.c as long as
> distutils passed the right -I path to gcc.

That's true, and it sounds like you've got that part working.


> Maybe I should compile the sift code as a shared object and link it to
> my extension? How would I get distutils to build the makefile and tell
> gcc how to link it?
>
> Thanks for the reply. Python has spoiled me and my C is rather
> rusty. :)

I don't know how to get setup.py to build a shared object separately.  
I am in the same Python/C situation as you. I'm scrubbing the rust off  
of my C skills and I'm also a n00b at developing extensions. I've  
learned a lot from looking at other people's setup code, so maybe I  
can help you there.

My posix_ipc module links to the realtime lib "rt" and here's the  
relevant snippets of setup.py:

------------------------------
import distutils.core as duc

libraries = [ ]

libraries.append("rt")

source_files = ["posix_ipc_module.c"]

ext_modules = [ duc.Extension("posix_ipc",
                               source_files,
                               define_macros=define_macros,
                               libraries=libraries
                              )
               ]

duc.setup(name="posix_ipc", version=VERSION, ext_modules=ext_modules)

------------------------------

You can download the whole thing here if you want to examine all the  
code:
http://semanchuk.com/philip/posix_ipc/

HTH
Philip



More information about the Python-list mailing list