[issue11653] Problems with some tests using -j2

Ned Deily report at bugs.python.org
Mon Mar 28 23:06:12 CEST 2011


Ned Deily <nad at acm.org> added the comment:

Antoine is correct in principle, however LD_LIBRARY_PATH does not work on OS X.  To test without installing, you would need to use DYLD_LIBRARY_PATH instead.  Also keep in mind that, unlike most other systems, OS X binaries embed absolute paths to dynamic libraries.

As a learning exercise for myself, I constructed this example.  I added a printf to the errno module, a module that is included in the shared library, to help see what's happening:

$ cd /tmp/a/py3k
$ ./configure --prefix=/tmp/a/local --enable-shared LDFLAGS=-L/opt/local/lib CPPFLAGS=-I/opt/local/include && make
$ file ./libpython3.3m.dylib 
./libpython3.3m.dylib: Mach-O 64-bit dynamically linked shared library x86_64
$ otool -L ./python
./python:
	/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 550.42.0)
	/tmp/a/local/lib/libpython3.3m.dylib (compatibility version 3.3.0, current version 3.3.0)
[...]
# note, "make install" not yet run so lib not available in configured path
$ ls /tmp/a/local/lib/libpython3.3m.dylib
ls: /tmp/a/local/lib/libpython3.3m.dylib: No such file or directory
$ ./python -c 'pass'
dyld: Library not loaded: /tmp/a/local/lib/libpython3.3m.dylib
  Referenced from: /private/tmp/a/py3k/./python
  Reason: image not found
Trace/BPT trap
# override path so that uninstalled shared lib is found in build dir
$ DYLD_LIBRARY_PATH=. ./python -c 'pass'
errno module version 0
$ make install
$ ls /tmp/a/local/lib/libpython3.3m.dylib
/tmp/a/local/lib/libpython3.3m.dylib*
# now lib is installed and found
$ ./python -c 'pass'
errno module version 0
# edit message in errno module to "version 1"
$ make
# have not done a new install so old shared lib is found
$ ./python -c 'pass'
errno module version 0
# enable dynamic loader printing of loads
$ export DYLD_PRINT_LIBRARIES=1
$ ./python -c 'pass'
dyld: loaded: /private/tmp/a/py3k/./python
dyld: loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
dyld: loaded: /tmp/a/local/lib/libpython3.3m.dylib
[...]
errno module version 0
# override loads from build directory -> works correctly
$ DYLD_LIBRARY_PATH=. ./python -c 'pass'
dyld: loaded: /private/tmp/a/py3k/./python
dyld: loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
dyld: loaded: /private/tmp/a/py3k/libpython3.3m.dylib
errno module version 1
# install updated lib
$ make install
# also works correctly
$ ./python -c 'pass'
dyld: loaded: /private/tmp/a/py3k/./python
dyld: loaded: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
dyld: loaded: /tmp/a/local/lib/libpython3.3m.dylib
[...]
errno module version 1

So the moral of the story is: if you use --enable-shared, you need to be careful to either "make install" or to use DYLD_LIBRARY_PATH=/path/to/build_directory.

Skip, are you OK with closing this issue?

----------
resolution:  -> works for me
stage:  -> committed/rejected
status: open -> pending

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue11653>
_______________________________________


More information about the Python-bugs-list mailing list