Откат совместимости версии библиотек в Mac OS X - PullRequest
14 голосов
/ 02 апреля 2011

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

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

Мы начали компилировать для 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 имела смысл, но я как-то отступил. Я думаю, что ссылка, которую я представил, осталась у них в голове, даже когда я вернулся к тому, что было. Наверное, я забыл первое правило этой беседы о птицах и пчелах, данное моим системным администратором: «Каждый раз, когда вы символизируете динамическую библиотеку, вы отдаете часть себя, которую вы никогда не получите назад».

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

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

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

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

1 Ответ

2 голосов
/ 28 апреля 2011

Извините, если я лаю не на том дереве, но что я могу сказать, что Солнечные часы в версии 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 в вашем примере?

...