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

标签 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

最佳答案

看起来您的 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/

相关文章:

c++ - 无法破译来自链接器的错误

c - GCC 正在生成充满零的二进制文件

ios - BITCODE_ENABLE 和 dylib 框架之间的确切联系是什么?

fortran - Fortran 中的指针数组

matlab - 漏洞? MATLAB MEX 更改默认逻辑的种类

c++ - dyld : Library not loaded: libicui18n. 54.dylib 引用自:/usr/local/lib/libxerces-c-3. 1.dylib

macos - 如何在不通过 brew 安装的情况下使用 `psql`

c - 如果程序有 `-I`语句,是否需要在 `gcc`中使用 `#include`标志?

c++ - 与 at() 或索引相比,为什么使用 C++ 迭代器会显着增加代码大小?

debugging - 在 Fortran 程序中,检查是否使用 "-g"进行编译