我在尝试运行 Bayescan 2.0 时遇到错误。
这是在 Mac OS X 10.9.2 Mavericks 上。当简单地调用没有输入文件的程序时,帮助菜单会正常显示。
BayeScan2.1_macos64bits --help
但是,当使用输入文件作为参数执行程序时...
BayeScan2.1_macos64bits test.input
此错误显示:
dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libgomp.1.dylib
Expected in: /usr/local/lib/libgcc_s.1.dylib
dyld: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libgomp.1.dylib
Expected in: /usr/local/lib/libgcc_s.1.dylib
Trace/BPT trap: 5
该程序过去执行得非常好。我的预感是“libgcc_s.1.dylib”中引用了错误的 gcc 库,但我不知道如何修复。我尝试过安装各种版本的 gcc 和 gfortran,但多次安装似乎通常是一个坏主意。 Macports 和 Homebrew 均已安装。
已经有another可能与 R-forge 软件包相关的安装问题,并显示“未找到符号”错误消息,该错误消息也引用了 libgcc_s.1.dylib。不幸的是我不知道这个 dylib 是什么,如何搜索符号,链接正确版本的 gcc 等。
我的事件 gcc 版本似乎是 LLVM 5.1:
gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
gfortran 版本是 4.9:
gfortran --version
GNU Fortran (GCC) 4.9.0
但是看起来可能存在多个 gcc 库?
ls -1 /usr/local/lib/gcc
i686-apple-darwin8/
i686-apple-darwin8.8.1/
powerpc-apple-darwin8/
x86_64-apple-darwin13.0.0/
另外,它看起来像/opt/local/bin 中的其他 gcc/gfortran 版本:
ls -1 /opt/local/bin/*gfortran*; ls -1 /opt/local/bin/*gcc*
/opt/local/bin/gfortran-mp-4.7*
/opt/local/bin/gfortran-mp-4.8*
/opt/local/bin/x86_64-apple-darwin13-gfortran-mp-4.7*
/opt/local/bin/x86_64-apple-darwin13-gfortran-mp-4.8*
/opt/local/bin/gcc-ar-mp-4.7*
/opt/local/bin/gcc-ar-mp-4.8*
/opt/local/bin/gcc-mp-4.7*
/opt/local/bin/gcc-mp-4.8*
/opt/local/bin/gcc-nm-mp-4.7*
/opt/local/bin/gcc-nm-mp-4.8*
/opt/local/bin/gcc-ranlib-mp-4.7*
/opt/local/bin/gcc-ranlib-mp-4.8*
/opt/local/bin/x86_64-apple-darwin13-gcc-4.7.3*
/opt/local/bin/x86_64-apple-darwin13-gcc-4.8.3*
/opt/local/bin/x86_64-apple-darwin13-gcc-ar-mp-4.7*
/opt/local/bin/x86_64-apple-darwin13-gcc-ar-mp-4.8*
/opt/local/bin/x86_64-apple-darwin13-gcc-mp-4.7*
/opt/local/bin/x86_64-apple-darwin13-gcc-mp-4.8*
/opt/local/bin/x86_64-apple-darwin13-gcc-nm-mp-4.7*
/opt/local/bin/x86_64-apple-darwin13-gcc-nm-mp-4.8*
/opt/local/bin/x86_64-apple-darwin13-gcc-ranlib-mp-4.7*
/opt/local/bin/x86_64-apple-darwin13-gcc-ranlib-mp-4.8*
gcc/gfortran 的多个版本是否导致此错误?还有其他想法吗? 欢迎任何帮助!抱歉,我无法进一步描述我的 Fortran 设置。
编辑: 这是一个相关的帖子: https://github.com/mash/node-imagemagick-native/issues/17
编辑#2: 此错误是由多个程序引起的。为了说明这一点,下面是尝试运行 Genepop 程序时出现的错误消息:
Genepop
Genepop version 4.2.1
Unable to open file genepop.txt
Unable to open file dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libstdc++.6.dylib
Expected in: /usr/local/lib/libgcc_s.1.dylib
dyld: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libstdc++.6.dylib
Expected in: /usr/local/lib/libgcc_s.1.dylib
Trace/BPT trap: 5
如果我暂时屏蔽 libgcc_s.1.dylib...
sudo mv /usr/local/lib/libgcc_s.1.dylib /usr/local/lib/libgcc_s.1.dylibTEMP
Genepop
Genepop version 4.2.1
Unable to open file genepop.txt
Unable to open file dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libstdc++.6.dylib
Expected in: /usr/lib/libSystem.B.dylib
dyld: Symbol not found: ___emutls_get_address
Referenced from: /usr/local/lib/libstdc++.6.dylib
Expected in: /usr/lib/libSystem.B.dylib
Trace/BPT trap: 5
最后,如果我屏蔽整个/usr/local 目录,这可以解决某些程序(Genepop)的问题!但不适合其他人(贝叶斯扫描):
sudo mv /usr/local /usr/localTEMP
BayeScan2.1_macos64bits test.input
dyld: Library not loaded: /usr/local/lib/libgomp.1.dylib
Referenced from: /Users/maierpa/programs/Bayescan
Reason: image not found
Trace/BPT trap: 5
最佳答案
看起来您的 BayeScan2.1_macos64bits
版本链接到了比/usr/local/lib/libgcc_s.1.dylib 处的副本更新的 libgcc
/usr/local/lib/libgomp.1.dylib
是如何安装在您的系统上的? (也许它是通过从 homebrew/MacPorts/其他东西安装 GCC 来实现的?)
我注意到通过自制程序安装 GCC 4.8 后,我在这里有一个 libgomp.1.dylib 的副本:
/usr/local/Cellar/gcc/4.8.3_1/lib/gcc/x86_64-apple-darwin13.2.0/4.8.3/libgomp.1.dylib
如果我告诉它搜索该目录,预构建的 BayeScan2.1_macos64bits 二进制文件会在我的系统上运行:
DYLD_LIBRARY_PATH=/usr/local/Cellar/gcc/4.8.3_1/lib/gcc/x86_64-apple-darwin13.2.0/4.8.3/./BayeScan2.1_macos64bits
为了在 OS X 10.9 及更高版本上获得更流畅的体验,您可以考虑使用 clang 编译器而不是 GCC 重建 BayeScan/genepop。使用 clang 构建可以避免预构建的 BayeScan 对新的和改进的 libstdc++ 的依赖问题,这似乎导致了这里的问题(现在 OS X 10.9+ 附带的老化 libstdc++ 似乎缺少关键符号)。
不幸的是,在撰写本文时,Xcode 命令行工具提供的 clang 的库存版本似乎不支持 -fopenmp
,您需要构建 BayeScan 依赖项 libgomp。
因此,构建 libgomp 可能需要暂时安装 clang-omp 并使用它而不是 Apple 的库存 clang: http://clang-omp.github.io/
关于gcc - 多个 gcc 版本是否会混淆 dylib(libgcc_s.1.dylib)并阻止二进制文件运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26043356/