Файлы Oct работают под Octave 3.6.4 или 4.0.0, но не оба

#shared-libraries #octave

#octave

Вопрос:

У меня установлены две версии Octave, версия 3.6.4, установленная через диспетчер пакетов (Linux Mint Debian), и версия 4.0.0, скомпилированная из исходного кода. У меня также есть множество файлов .oct в папке, на которую указано в файле .octaverc. Моя проблема в том, что версия 4.0.0 не может «видеть» эти файлы .oct, и если я попытаюсь вызвать их, весь сеанс завершится сбоем, если я не перекомпилирую их под 4.0.0 с помощью mkoctfile. Однако это означает, что версия 3.6.4 не может их «видеть», и попытка вызвать их выдает сообщение об ошибке

 failed to load: liboctinterp.so.3: cannot open shared object file: No such file or directory
 

Как я могу заставить обе версии распознавать мои функции .oct без необходимости перекомпилировать их каждый раз?

Комментарии:

1. двойная публикация octave.1599824.n4.nabble.com /…

Ответ №1:

Я копирую ответ от Майка и Олафа из списка рассылки справки (перекрестная рассылка http://octave.1599824.n4.nabble.com/Oct-files-run-in-Octave-version-3-6-4-or-4-0-0-but-not-both-td4672690.html)

Короткий ответ: вы не можете.

API библиотеки Octave и ABI меняются между выпусками. Octave 3.6 был liboct{ave,interp}.so.1, Octave 3.8 был liboct{ave,interp}.so.2, а 4.0 — liboct{ave,interp}.so.3. Эти библиотеки не совместимы ни с прямой, ни с обратной связью.

Вы можете скомпилировать свои файлы oct в два (или три?) разные пути с нужной версией Octave в пути.

Если вы хотите установить свои файлы в масштабах всей системы, хорошим каталогом-кандидатом для скомпилированных по-разному файлов oct, по-видимому, является

 fullfile (OCTAVE_HOME (), "lib/octave/site/oct/", octave_config_info ("canonical_host_type"))
 

предполагая, что OCTAVE_HOME () отличается для каждой из ваших версий Octave. По умолчанию этот каталог указан в path.

Если это не общесистемный, вы можете проверить OCTAVE_VERSION () в вашем .octaverc и задать путь по-разному для каждой версии.