2014-09-19 1 views
0

Я загрузил написанный на Python C++-код и пытаюсь его создать из исходного кода, и он компилируется без ошибок, но когда я запускаю конечный результат, он терпит неудачу таким образом, что кажется, что он не нашел хотя бы одну из библиотек, к которым он должен был ссылаться.building python Расширение C++ - как узнать, не найден ли связанная библиотека

Что меня удивляет, в distutils.core.Extension вы можете предоставить список библиотек, но нет никакой ошибки или сообщения, чтобы сообщить мне, что одна из библиотек не существует. Я могу поместить любую строку таблеток в список, и она будет работать без ошибок. Есть ли настройка для этого в Extension? Или любой другой способ проверить?

Для справки, здесь setup.py код (Ubuntu 14.04, Python 2.7):

coolmodule = Extension('cool', 
    sources = [ 
     'cool/main_python.c' 
    ], 
    libraries = [ 
     'cool', 
     'stdc++' 
     'lapack', 
     'blas', 
     'gfortran', 
     'fftw3', 
     # if I add any gibberish string to this list, 
     # it still runs without error! 
    ], 
    library_dirs = ['./build'], 
    extra_link_args = [ 
     './build/libcool.a' 
    ] 
) 

setup(name = 'cool', 
    ext_modules = [coolmodule] 
) 

Спасибо заранее !!

ответ

1

Вы создаете общую библиотеку, которую вы импортируете как модуль Python? Если это так, вы можете использовать утилиту ldd в Linux/Unix для просмотра разделяемых библиотек, необходимых вашему модулю. В Mac OS X, эквивалентный инструмент otool -L

(test)MacBook-Air-2:foo talumbau$ otool -L foo_ext.so 
foo_ext.so: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 2577.0.0) 

Если разделяемая библиотека требует других библиотек, и они не будут найдены, ldd или otool -L покажет вам, какие из них. Затем вы можете отследить их и изменить свой LD_LIBRARY_PATH, чтобы они были связаны с ним во время загрузки.