Konflikt pomiędzy dynamicznym priorytetem linkowania w OSX?

Istnieje konflikt dynamicznego łączenia pomiędzy różnymi dynamicznymi bibliotekami libjpeg na OSX. Najpierw jest standardowy natywny libJPEG.dylib (in / System/Library/Framework / ImageIO.framework / Versions / A / Resources/). Ale jeśli używasz MacPorts, możesz również mieć libjpeg związany z portem.dylib in (in / opt / local / lib). Ten ostatni może na przykład zostać zainstalowany jako zależność dla innego portu.

Stwarza to problem, gdy łączysz się z systemowym libJPEG (co jest preferowane). Jeśli /opt/local/lib znajduje się w DYLD_LIBRARY_PATH, ścieżka ta będzie miała priorytet podczas wyszukiwania dynamicznej biblioteki lib, co spowoduje błąd podczas ładowania symboli:

dyld: Symbol not found: __cg_jpeg_resync_to_restart
 Referenced from:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
 Expected in: /opt/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5

Więc mam dwa pytania (prawdopodobnie związane):

  1. Jaki jest dobry sposób rozwiązania rzeczywistego problemu (usunięcie /opt/local/lib z DYLD_LIBRARY_PATH Oczywiście go rozwiązuje, ale stwarza problemy dla innych zależności)?

  2. Jakie inne ścieżki są wyszukiwane dla bibliotek dynamicznych (tzn. gdzie jest "/System / Library " ścieżka określona) i dlaczego DYLD_LIBRARY_PATH ma wyższy priorytet?

Author: kamjagin, 2013-07-14

6 answers

Nie należy ustawiać ścieżek bibliotek za pomocą DYLD_LIBRARY_PATH. Jak już odkryłeś, to ma tendencję do eksplodowania. Pliki wykonywalne i biblioteki powinny mieć wbudowane wymagania biblioteczne w czasie połączenia. Użyj otool -L, aby dowiedzieć się, czego szuka plik:

$ otool -L /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO:
    /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0)
    ...
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

Dla przykładu jednego z moich programów zbudowanych w homebrew:

$ otool -L /usr/local/bin/gifcolor
/usr/local/bin/gifcolor:
    /usr/local/Cellar/giflib/4.1.6/lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)

Zauważ, że odwołuje się do /usr/local. Jeśli zbudowałeś go w taki sposób, że odwołuje się do niewłaściwej biblioteki, polecam przebudować i skierować go do poprawnie biblioteka.

Jeśli jest to niemożliwe, można edytować ścieżkę używając install_name_tool, ale są przypadki, w których to nie działa, na przykład jeśli nowa ścieżka jest dłuższa niż stara ścieżka i nie powiązano jej z -header_pad_max_install_names. Preferowana jest przebudowa z prawidłową ścieżką.

Zauważ, że istnieje kilka "specjalnych" ścieżek, które umożliwiają odnalezienie bibliotek w stosunku do ich loadera. Zobacz @executable_path/ i jego krewnych na stronie man dyld(1).

 10
Author: Rob Napier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 01:32:31

Doświadczyłem podobnego problemu podczas korzystania z OpenCV w MacOS El Capitan. Rozwiązano problem używając rozwiązania w linku

Rozwiązaniem jest usunięcie niektórych dlylib z katalogu / usr / local / lib i utworzenie dowiązań symbolicznych do powiązanych plików/System/Library/Framework / ImageIO.framework / Resources /

cd /usr/local/lib
rm libgif.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libGIF.dylib libGIF.dylib
rm libjpeg.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libJPEG.dylib libJPEG.dylib
rm libtiff.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libTIFF.dylib libTIFF.dylib
rm libpng.dylib
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libPng.dylib libPng.dylib
 33
Author: mdemirst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 03:44:44

Miałem podobny błąd podczas próby uruchomienia Apache Celix na macOS Sierra Jeśli używasz Homebrew do instalacji libjpeg, libtiff, libpng co może mylić linker z używaniem biblioteki macOS imageIO. Simple fix to unlink te libs:

brew unlink libpng
brew unlink libtiff
brew unlink libjpeg

Ponownie połącz te libs, kiedy tylko trzeba:

brew link libpng
brew link libtiff
brew link libjpeg
 8
Author: Thien Pham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 01:23:54

Jeśli używasz Qt Creator, musisz odznaczyć opcję Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH z sekcji Run w zakładce Projects:

qtcreator

 8
Author: Iulian Onofrei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 21:19:44

Miałem podobny błąd i rozwiązałem umieszczanie następującej zmiennej w moim bash_profile:

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH
 2
Author: Franzé Jr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 16:39:28

Postępowałem zgodnie z instrukcjami mdemirst zasugerował i to naprawiło mój problem. Używam OS X Sierra.

Stworzyłem gist na wypadek, gdyby ktoś inny napotkał ten sam problem.

Gist naprawiający błędy Spidermonkey

 0
Author: Chris Wessells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 23:15:50