Версия совместимости с откатом для библиотек в Mac OS X

Итак, я люблю свой Macbook, и она меня любит. У нас есть взлеты и падения, но по большей части наши отношения были сильными. Недавно, хотя мы сражались. это началось достаточно просто. Я просил ее сделать больше, пытаясь быть более экспериментальным. Мы приносили такие вещи, как sse, быстрая математика, и разворачивались в спальню и составляли новые версии наших библиотек.

Это началось достаточно хорошо. Мы скомпилировали некоторый код с использованием новых библиотек, протестировали новые воды. Со временем наша работа как пара взлетела. Она работала быстрее, и я думал, что все хорошо и хорошо. Потом все ухудшилось. Мы привели другого игрока в микс. Ее зовут Матлаб.

Мы начали компиляцию для Matlab,

mex CC="gcc" CFLAGS="\$CFLAGS -msse -msse2 -msse3 -ffast-math -ftree-vectorize" LDFLAGS="\$LDFLAGS -msse2 -msse3 -ffast-math -ftree-vectorize" -I/usr/local/include -L/usr/local/lib -lsundials_cvode -lsundials_nvecserial -v -o kry_new.mexmaci64 mex_main.c

компиляция и привязка отлично работали. Но затем начались проблемы:

kry_new(param,init,0:60:240,abstol,rtol,1)
??? Invalid MEX-file
'/Users/Andrew/Documents/MATLAB/het_optim/kry_new.mexmaci64':
dlopen(/Users/Andrew/Documents/MATLAB/het_optim/kry_new.mexmaci64, 1):
Library not loaded: /usr/local/lib/libsundials_cvode.1.dylib
  Referenced from: /Users/Andrew/Documents/MATLAB/het_optim/kry_new.mexmaci64
  Reason: Incompatible library version: kry_new.mexmaci64 requires version
  2.0.0 or later, but libsundials_cvode.1.dylib provides version 1.0.0.
Матлаб почувствовал, что наши эксперименты прошли далеко. То, что они были совершенно разными версиями библиотек. Я не знаю, откуда у нее эта идея. Я сделал несколько исследований:
$ otool -L kry_new.mexmaci64 
kry_new.mexmaci64:
    /usr/local/lib/libsundials_cvode.1.dylib (compatibility version 2.0.0, current version 2.0.0)
    @loader_path/libsundials_nvecserial.0.0.2.dylib (compatibility version 0.0.0, current version 0.0.2)
    @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0)
    @loader_path/libmex.dylib (compatibility version 0.0.0, current version 0.0.0)
    @loader_path/libmat.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

Проблема была в libsundials_cvode. Не было версии 2, никогда не было. Что еще хуже, мой Macbook взял сторону Matlab. Я попытался удалить, разделив все ссылки на новые вещи, даже удалил наши файлы make и попытался начать заново. Я пытался перестроить наши библиотеки по-старому. Но они не отпустили неуловимую версию 2. Я не знал, как дать им то, что они хотят. Я просто не был достаточно человеком, чтобы оправдать их ожидания.

Единственное, что я мог догадаться, это то, что в какой-то момент версия 2 имела смысл, но я как-то от нее отказался. Я предполагаю, что ссылка, которую я представил, осталась в их сознании, даже когда я вернулся к тому, как это было. Наверное, я забыл о первом правиле этих птиц и о пчелах, которые дал мой администратор sys: "Каждый раз, когда вы символизируете динамическую библиотеку, вы отдаете часть себя, чтобы вы никогда не возвращались".

В отчаянии, чтобы сохранить мою Macbook и Matlab в моей жизни, я сказал ложь, что я не горжусь:

sudo mv libsundials_cvode.1.0.0.dylib libsundials_cvode.2.0.0.dylib 

Я не думал, что это сработает, но так оно и было. Теперь они компилируют мой код, и они кажутся достаточно счастливыми. Но у меня есть затяжное чувство, что я просто притворяюсь, и что моя ложь вернется, чтобы укусить меня.

Итак, поскольку Дэн Сэвидж просто игнорирует меня, я обращаюсь к вам в stackoverflow для консультаций по отношениям. Мне нужно как-то сказать моему Macbook, что для нас нет версии 1.0.0. Как я могу заставить ее послушать меня и исправить проблемы совместимости в моих отношениях без моей ужасной лжи?

Ответ 1

Простите, если я лаю неправильное дерево, но из того, что я могу сказать, Sundials находится в версии 2.4 (с отдельными библиотеками на 2.6)? https://computation.llnl.gov/casc/sundials/download/download.html. Вы пробовали компиляцию из источников здесь?

Я только что скомпилировал и установил на своем Mac Pro 10.6.7 без проблем! Для установки .dylib вам нужно настроить, используя следующую команду: иначе они генерируют .la и .a

./configure --enable-shared

Теперь у меня есть следующее:

w125-244:sundials-2.4.0 stevemoss$ ls -al /usr/local/lib/libsundials_cvode*
-rwxr-xr-x  1 root  staff    4136 28 Apr 16:07 /usr/local/lib/libsundials_cvode.1.0.0.dylib
lrwxr-xr-x  1 root  staff      29 28 Apr 16:07 /usr/local/lib/libsundials_cvode.1.dylib -> libsundials_cvode.1.0.0.dylib
-rw-r--r--  1 root  staff  512704 28 Apr 16:07 /usr/local/lib/libsundials_cvode.a
lrwxr-xr-x  1 root  staff      29 28 Apr 16:07 /usr/local/lib/libsundials_cvode.dylib -> libsundials_cvode.1.0.0.dylib
-rwxr-xr-x  1 root  staff     878 28 Apr 16:07 /usr/local/lib/libsundials_cvode.la
-rwxr-xr-x  1 root  staff    4136 28 Apr 16:07 /usr/local/lib/libsundials_cvodes.2.0.0.dylib
lrwxr-xr-x  1 root  staff      30 28 Apr 16:07 /usr/local/lib/libsundials_cvodes.2.dylib -> libsundials_cvodes.2.0.0.dylib
-rw-r--r--  1 root  staff  926048 28 Apr 16:07 /usr/local/lib/libsundials_cvodes.a
lrwxr-xr-x  1 root  staff      30 28 Apr 16:07 /usr/local/lib/libsundials_cvodes.dylib -> libsundials_cvodes.2.0.0.dylib
-rwxr-xr-x  1 root  staff     885 28 Apr 16:07 /usr/local/lib/libsundials_cvodes.la

и

w125-244:sundials-2.4.0 stevemoss$ otool -L /usr/local/lib/libsundials_cvode.dylib
/usr/local/lib/libsundials_cvode.dylib:
    /usr/local/lib/libsundials_cvode.1.dylib (compatibility version 2.0.0, current version 2.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.10)

Кроме того, возможно, символическая ссылка могла бы быть лучше, чем mv в вашем примере?