启动Wireshark时报错"dyld: Symbol not found: ..."

在OSX上启动Wireshark失败,产生一系列"dyld: Symbol not found: ... "提示:

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

dyld是OSX系统中的链接器,上面的大意是:链接器加载系统框架时在"libTIFF.dylib"库中发现了一个名为”__cg_jpeg_resync_to_restart"的符号,该符号应该是一个未定义的符号,因此,链接器就去"/usr/local/lib/libJPEG.dylib"库中继续找这个符号的定义,结果没找到。

用 otool -L 查看依赖

/System / Library / Frameworks / ImageIO.framework / Versions / A / Resources / libTIFF.dylib ”libTIFF.dylib”依赖于同目录下的"libJPEG.dylib"。

用 nm 查看库中的符号

/System / Library / Frameworks / ImageIO.framework / Versions / A / Resources / libTIFF.dylib有一个类型为"undefined"的符号”__cg_jpeg_resync_to_restart"。


/System / Library / Frameworks / ImageIO.framework / Versions / A / Resources / libJPEG.dylib有一个类型为"text section"的符号”__cg_jpeg_resync_to_restart"。


/usr/local/lib/libJPEG.dylib

没有发现”__cg_jpeg_resync_to_restart”符号。


也就是说,链接器在加载"/System / Library / Frameworks / ImageIO.framework / Versions / A / Resources / libTIFF.dylib"时,本应加载与其同目录下的"libJPEG.dylib",结果却加载了"/usr/local/lib/"目录下的"libJPEG.dylib",虽然名字相同,但这个"libJPEG.dylib"中却没有定义”__cg_jpeg_resync_to_restart"符号,因此就报错了。

dyld支持通过设置环境变量来影响链接器的行为,其中有一个环境变量叫"DYLD_LIBRARY_PATH",一旦设置了它,链接器就会去这个路径下搜索需要的库,而忽略默认路径。

这里的问题就是由于set了环境变量"DYLD_LIBRARY_PATH=/usr/local/lib"导致的,解决办法是把它unset掉。

除非必要,不要轻易设置与dyld相关的环境变量,若遇到类似的问题,可以先查一下是否set了前缀为"DYLD"的环境变量。