Ned Deily <[email protected]> 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 <[email protected]>
<http://bugs.python.org/issue11653>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com