2016-06-02 3 views
0

Я делаю менеджер пакетов и хочу, чтобы пакеты использовали нужную зависимую библиотеку, установив опцию rpath во время компиляции. Но это удивило меня в OS X (10,11), вот проблема:dylib set by rpath не загружен в OS X

$ otool -L /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
/opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951: 
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 
    /opt/starman/software/isl/0.17.1/104994def2b7fb2dae7950b42205eb718a46ee0c/lib/libisl.15.dylib (compatibility version 18.0.0, current version 18.1.0) 
    /opt/starman/software/mpc/1.0.3/6058925218009b8ab17e07333dc54de334134f6e/lib/libmpc.3.dylib (compatibility version 4.0.0, current version 4.0.0) 
    /opt/starman/software/mpfr/3.1.4/f142dfcda3b56650a8c9cfe2fdd09ffdf7283a00/lib/libmpfr.4.dylib (compatibility version 6.0.0, current version 6.4.0) 
    /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib (compatibility version 14.0.0, current version 14.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 

см gmp версия 14.0.0.

$ /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
dyld: Library not loaded: /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib 
    Referenced from: /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
    Reason: Incompatible library version: f951 requires version 14.0.0 or later, but libgmp.10.dylib provides version 13.0.0 
Trace/BPT trap: 5 

Это говорит gmp в правильном пути не загружен, так как его версия 13.0.0, но это 14.0.0! Я знаю, что у меня есть более старая версия gmp, установленная в другом пути, поэтому после того, как я удаляю свой путь от DYLD_LIBRARY_PATH, проблема исчезла, но не должно rpath решить эту проблему?

Почему dyld печатает правильный путь gmp, но на самом деле использует неправильный старый? Есть ли какие-либо трюки в OS X? Спасибо за помощь!

EDIT 1: Версия /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib проверяют

$ otool -l /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib 
... 
     cmdsize 120 
     name /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib (offset 24) 
    time stamp 1 Thu Jan 1 08:00:01 1970 
     current version 14.0.0 
compatibility version 14.0.0 
... 

И старшего gmp является

$ otool -l /opt/software/gmp/6.0.0a/0/lib/libgmp.10.dylib 
... 
     name @rpath/lib/libgmp.dylib (offset 24) 
    time stamp 1 Thu Jan 1 08:00:01 1970 
     current version 13.0.0 
compatibility version 13.0.0 
... 

Eidt 2

Согласно 0xced, я запустить отладку процесса загрузки, как (Полный выход here):

$ export DYLD_PRINT_LIBRARIES="1" 
$ /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
dyld: loaded: /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
dyld: loaded: /usr/lib/libiconv.2.dylib 
dyld: loaded: /opt/starman/software/isl/0.17.1/104994def2b7fb2dae7950b42205eb718a46ee0c/lib/libisl.15.dylib 
dyld: loaded: /opt/software/packman.active/lib/libmpc.3.dylib 
dyld: loaded: /opt/software/packman.active/lib/libmpfr.4.dylib 
dyld: loaded: /opt/software/packman.active/lib/libgmp.10.dylib 
dyld: unloaded: /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
dyld: unloaded: /opt/starman/software/isl/0.17.1/104994def2b7fb2dae7950b42205eb718a46ee0c/lib/libisl.15.dylib 
dyld: unloaded: /opt/software/packman.active/lib/libmpc.3.dylib 
dyld: unloaded: /opt/software/packman.active/lib/libmpfr.4.dylib 
dyld: unloaded: /opt/software/packman.active/lib/libgmp.10.dylib 
dyld: Library not loaded: /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib 
    Referenced from: /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 
    Reason: Incompatible library version: f951 requires version 14.0.0 or later, but libgmp.10.dylib provides version 13.0.0 
Trace/BPT trap: 5 
+0

Что такое rpath, связанный с вопросом? Вы уверены, что версия библиотеки 'gmp' равна 14, а не 13? – Droppy

+0

Поскольку путь библиотеки 'gmp' жестко запрограммирован в' f951', и я думаю, что это эффект 'rpath'. Версии двух 'gmp' на моем компьютере показаны выше, используя' otool -l'. –

ответ

0

Я не понимаю, почему f951 двоичный загрузит /opt/software/gmp/6.0.0a/0/lib/libgmp.10.dylib (версия 13), а не /opt/starman/software/gmp/6.1.0/0ec8ef118d09cb33f83559685d006f56a74f865c/lib/libgmp.10.dylib (версия 14), который задается абсолютный путь, а не относительный @rpath.

Возможно, оно загружается косвенно через другую библиотеку, например. libisl.15.dylib, libmpc.3.dylib или libmpfr.4.dylib, которые могут иметь ссылку @rpath на libgmp.10.dylib?

Чтобы диагностировать эту проблему, я предлагаю вам запустить основной исполняемый файл, как это:

$ DYLD_PRINT_RPATHS=YES /opt/starman/software/gcc/6.1.0/83894f21d07366be296600ec031ae4f6241381d9/libexec/gcc/x86_64-apple-darwin15.5.0/6.1.0/f951 

Это будет печатать все RPATH разложения (как неудачи и успех), и, вероятно, даст вам ответ на ваш вопрос.

+0

Спасибо за помощь! Я проверил эти dylib, и все они загрузили правильный 'gmp'. Я также запускаю 'f951' с' DYLD_PRINT_RPATHS = YES', но не печатает больше информации. –

+0

Я экспортирую 'DYLD_PRINT_LIBRARIES' в 1 ссылку' https: // gist.github.com/wycats/1627976', и он печатается. Полный выход [здесь] (https://gist.github.com/dongli/c0b8153573db0332ef519c74341cd264) –

+0

Работает ли оно, если вы удаляете '/ opt/software/packman.active/lib' из переменной' DYLD_LIBRARY_PATH'? – 0xced

 Смежные вопросы

  • Нет связанных вопросов^_^