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):
Jaki jest dobry sposób rozwiązania rzeczywistego problemu (usunięcie
/opt/local/lib
zDYLD_LIBRARY_PATH
Oczywiście go rozwiązuje, ale stwarza problemy dla innych zależności)?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?
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)
.
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
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
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
:
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
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.
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