Это - вопрос о новичке и продолжение этого, где на меня указали GLPK.
Я пытаюсь получить PyGLPK, привязку Python для GNU, в который Линейное Программирование Одевает и выполнение, но независимо от того, что я делаю, я, может казаться, не создаю и не устанавливаю GLPK так, чтобы Python нашел его правильно. Это прибывает после выполнения./настраивать, сделайте, и sudo делают установку на библиотеках GLPK и следование инструкциям для PyGLPK.
А именно, вот ошибка, которую я получаю:
>>> import glpk
Traceback (most recent call last):
File "", line 1, in
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site- packages/glpk.so, 2): Symbol not found: __glp_lpx_print_ips
Referenced from: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so
Expected in: dynamic lookup
Я предполагаю, что что-то не связывается с где-то в другом месте, и что это, вероятно, имеет некоторое отношение к путям и переменным среды. Однако вот то, где мои способности в сбое оболочки, и я в замешательстве по тому, что сделать затем.
Редактирования
Я могу выполнить Решатель GLPK (glpsol
) из командной строки, таким образом, я знаю, что она работает, по крайней мере, в теории.
Однажды я пытался использовать MacPorts для установки версии GLPK. Я с тех пор удалил эту версию, хотя с помощью MacPorts.
Вот результат использования otool -L
, который, по-видимому, является ответом OS X на ldd
:
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/glpk.so:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
Снова, существует, вероятно, простой ответ на это, но у меня не было удачи с Google с помощью терминологии, которую я знаю.
Проблема решена!
Первое предложение Томаса Воутера было наиболее точным: модуль glpk.so
вообще не был связан с библиотекой C. Причина заключалась в том, что make
построил исходные библиотеки GLPK, используя gcc4.2
и указав 64-битную архитектуру, в то время как модуль Python distutils
настаивал на создании исходного кода PyGLPK. с использованием gcc-4.0
с 32-битной архитектурой.
Так как я не мог понять, как добавить флаги компилятора в distutils
, я просто перестроил библиотеки GLPK, установив флаги компилятора distutils
. Вот что наконец сработало.
Похоже, это проблема OS X 10.6. Сценарии ./ configure
запрашивают архитектуру системы, которая по умолчанию, я думаю, равна x86_64
, хотя Python 2.6 лучше всего работает с 32-битными двоичными файлами.
На самом деле проблема не в Python. Модуль glpk
- это модуль расширения, разделяемая библиотека C, которую загружает Python. Эта разделяемая библиотека C зависит от библиотеки GLPK C, которую она обертывает; загрузка модуля расширения должна загружать библиотеку GLPK C, чтобы модуль расширения мог ссылаться на символы из библиотеки GLPK C, например __ glp_lpx_print_ips
. Видимо, что-то там не получается. Это может быть одна из нескольких вещей:
glpk.поэтому модуль расширения
вообще не может быть связан с библиотекой GLPK C. Это означало бы, что он был построен без аргумента -l
, необходимого для линковки с библиотекой GLPK, что означает, что проблема заключается в процедуре сборки для модуля расширения glpk
. Вы можете определить, зависит ли glpk.so
от библиотеки C, используя инструмент ldd
. Например:
% ldd /usr/lib/python2.6/lib-dynload/gdbm.so
linux-gate.so.1 => (0xb77bb000)
libgdbm.so. 3 => /usr/lib/libgdbm.so.3 (0xb7799000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7780000)
libc. so.6 => /lib/i686/cmov/libc.so.6 (0xb7639000)
/ lib / ld-linux.so.2 (0xb77bc000)
Это показывает мой Модуль расширения gdbm
связан с разделяемой библиотекой libgdbm
(а также с другими разделяемыми библиотеками).
Модуль расширения glpk.so
может быть связан с библиотека GLPK C правильно, но динамический компоновщик может не найти библиотеку C. Обычно это приводит к другому предупреждению (о невозможности найти библиотеку C), но это может не произойти в MacOS. В этом можно убедиться, снова воспользовавшись инструментом ldd
: он перечислит зависимости, но не фактический загруженный файл (вместо этого он скажет «не найден»).
Обычно это вызвано не устанавливая библиотеку C или устанавливая ее в том месте, куда динамический компоновщик не знает, что искать. К сожалению, я не знаю, как MacOS X выполняет поиск в своей библиотеке и как вы должны изменять пути, которые он сканирует. (В большинстве систем UNIX вы должны отредактировать /etc/ld.so.conf
или файл в /etc/ld.so.conf.d/
, или запустите ldconfig -m
.)
glpk.so
модуль расширения может быть связан правильно, и динамический компоновщик может найти модуль правильно, но модуль расширения GLPK может не определять этот символ в конце концов. Это может быть ошибка в GLPK, или это может быть потому, что динамический компоновщик обнаруживает другую библиотеку GLPK C (другую версию или ту, которая построена иначе), или это может быть потому, что GLPK C библиотека была скомпилирована иначе, чем модуль расширения glpk.so
. Однако это немного сложно диагностировать, поскольку это означает копаться в фактических символах библиотеки C и файлах заголовков, используемых во время компиляции.
Я думаю, учитывая все обстоятельства, проблема №2. Это наиболее распространенная проблема, особенно при установке в / usr / local
, что обычно делает ./ configure
без аргумента - префикса
.