多个gcc版本会混淆dylibs(libgcc_s.1.dylib)并阻止二进制文件运行吗?

时间:2014-09-25 16:15:53

标签: gcc gfortran dylib dyld

我在尝试运行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

1 个答案:

答案 0 :(得分:1)

您的BayeScan2.1_macos64bits版本与新版libgcc相关联,而不是您在/usr/local/lib/libgcc_s.1.dylib上的副本

您的系统上是如何安装/usr/local/lib/libgomp.1.dylib的? (也许它是从自制软件/ 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 ++似乎缺少关键符号)。 p>

不幸的是,在撰写本文时,看起来像Xcode命令行工具提供的clang的库存版本不支持-fopenmp,您需要构建BayeScan依赖项libgomp。

因此构建libgomp可能需要现在安装clang-omp并使用它而不是Apple的股票代码:http://clang-omp.github.io/