Итак, я люблю свой 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. Как я могу заставить ее выслушать меня и исправить проблемы совместимости в моих отношениях без моей ужасной лжи?