2011-04-02 6 views
14

Entonces, amo mi Macbook, y ella me ama. Tenemos nuestros altibajos, pero en su mayor parte nuestra relación ha sido fuerte. Recientemente, tuvimos una pelea. comenzó simplemente lo suficiente. Le estaba pidiendo que hiciera más, tratando de ser más experimental. Trajimos cosas como sse, matemática rápida y desenrollarnos en el dormitorio y compilamos nuevas versiones de nuestras bibliotecas.Versión de compatibilidad de reversión de bibliotecas en Mac OS X

Comenzó bastante bien. Compilaríamos un código usando las nuevas bibliotecas, probando las nuevas aguas. Con el tiempo, nuestra actuación como pareja se disparó. Ella estaba trabajando más rápido y pensé que todo estaba bien. Entonces las cosas empeoraron. Trajimos a otro jugador a la mezcla. Su nombre es Matlab.

Empezamos la compilación de 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 

compilar y vincular funcionaba muy bien. Pero entonces comenzó el problema:

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. 

Matlab sintió que nuestros experimentos habían llegado demasiado lejos. Que eran versiones totalmente diferentes de las bibliotecas. No sé de dónde sacó esta idea. Hice algunas investigaciones:

$ 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) 

El problema estaba en libsundials_cvode. No hubo versión 2, nunca hubo. Para empeorar las cosas, mi Macbook tomó el lado de Matlab. Intenté desinstalar, eliminando todas las referencias a las cosas nuevas, incluso borré nuestros archivos make e intenté comenzar de nuevo. Traté de reconstruir nuestras bibliotecas a la vieja usanza. Pero no soltaron la elusiva versión 2. No sabía cómo darles lo que querían. Simplemente no era lo suficientemente hombre para cumplir con sus expectativas de mí.

Lo único que podía adivinar era que en algún punto, la versión 2 tenía sentido, pero que de alguna manera me alejé de ella. Supongo que el vínculo que les presenté se quedó en sus mentes incluso cuando volví a la forma en que estaba. Supongo que olvidé la primera regla de las aves y la charla de las abejas dada por el administrador de mi sistema: "Cada vez que simbolizas una biblioteca dinámica, das una parte de ti que nunca volverás".

En su desesperación para mantener tanto mi Macbook y Matlab en mi vida, he dicho una mentira que no estoy orgulloso de:

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

No pensé que iba a funcionar, pero lo hizo. Ellos compilan mi código ahora y parecen lo suficientemente felices. Pero tengo la sensación persistente de que solo lo estoy fingiendo, y que mi mentira volverá a morderme.

Así que, como Dan Savage simplemente me ignora, me dirijo a ti stackoverflow para consejos sobre relaciones. Necesito de alguna manera decirle a mi Macbook que, no, la versión 1.0.0 es suficiente para nosotros. ¿Cómo puedo lograr que me escuche y solucione los problemas de compatibilidad en mi relación sin mi horrible mentira?

+1

Ojalá lo supiera ... Sin embargo, todas las preguntas de StackOverflow deben volver a escribirse como columnas de consejos de relación. Estoy votando: espero que alguien más pueda ayudar. – stderr

Respuesta

2

Disculpe si estoy ladrando el árbol equivocado, pero por lo que puedo decir Sundials está en la versión 2.4 (con las bibliotecas individuales en 2.6)? https://computation.llnl.gov/casc/sundials/download/download.html. ¿Has intentado compilar desde las fuentes aquí?

Acabo de compilar e instalar en mi Mac Pro ejecutando 10.6.7 sin problemas! Debe configurar lo siguiente para instalar el .dylib, de lo contrario solo genera .la y.un

./configure --enable-shared 

ahora tengo los siguientes:

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 

y

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) 

Además, tal vez un enlace simbólico podría haber sido mejor que un mv en su ejemplo?