Question

I have a problem with python-config --ldflags on OS X 10.6.2.

Using my non-system python.org python install:

robin-mbp:~ robince$ which python
/Library/Frameworks/Python.framework/Versions/2.5/bin/python
robin-mbp:~ robince$ python-config --ldflags
-L/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -ldl -lpython2.5

But if I build a c program embedding Python with the above LDFLAGS, it results in the system python being embedded. It seems -lpython2.5 is picking up the system python first, before the one in the -L path.

So far the only way I've got it to work is with

LDFLAGS=-F/ -framework Python

but when it comes to distributing I'd really like to be able to use python-config.

What is going on with the library search path that stops it working as expected? According to the man page -L paths should be searched before the default path.

Is there any option along the lines of 'forget the default search path and search only paths specified with -L' that I could add to python-config output to get it to work?

Or is there any way to extract the working -framework flags from whichever Python is on the path (that would work for whatever the user is using, ie system, python.org, macports or own built)?

Was it helpful?

Solution

Sorry to answer my own question but I got an amazingly prompt reply on the pythonmac-sig mailing list where I also asked. It is a bug with current python: http://bugs.python.org/issue7541

Suggested workaround:

The easiest workaround is to open a terminal window and execute the following commands:

cd /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config ln -s libpython2.5.a libpython2.5.dylib

This will ensure that the OSX linker knows that libpython is a shared library and links to this library. By default the OSX linker searches for a .dylib on the entire linker path and only then looks for .a files.

EDIT: Further update:

If you can add mac-specific flags in your build system you could add -Wl,-search_paths_first to LDFLAGS on OSX, this ensures that the linker looks for both .dylib and .a files in a directory on the link path before moving to the next directory.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top