使用gcc-4.7和openMP缺少___emutls_get_address

Mar*_*rdi 8 gcc openmp dynamic-linking gcc4.7

我试图在Mac OS 10.8.2上使用自编译的GCC-4.7.1编译程序.该程序使用openMP,编译成功; 但是,当我尝试运行程序时,动态链接器会抱怨

dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
  Referenced from: /usr/local/gcc-4.7.1/lib/libgomp.1.dylib
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: ___emutls_get_address
  Referenced from: /usr/local/gcc-4.7.1/lib/libgomp.1.dylib
  Expected in: /usr/lib/libSystem.B.dylib
Run Code Online (Sandbox Code Playgroud)

在使用-fopenmp编译的任何程序中都会出现此问题,包括MWE

#include <stdio.h>

int main() {
  #pragma omp parallel
  printf("Hallo!\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,解决方案建议在什么是"___emutls_get_address"符号?,即-lgcc_eh在链接阶段添加,不起作用(我仍然得到相同的dyld错误消息).

小智 9

我也有完全相同的问题。而且我是 openMP 的新手,我的技能不太好使用 Michal Fapso 提供的解决方案。我通过使用解决了这个问题

brew link --overwrite gcc
Run Code Online (Sandbox Code Playgroud)

问题解决了!

也许您可以尝试将 gcc 重新安装到您的 Mac。


Mic*_*pso 3

我有完全相同的问题。就我而言,它是由 XCode 安装的旧版本 gcc 的库(我不记得是哪一个)链接引起的,该库位于 /usr/lib 中。当我更正它以链接到我用于编译的版本的较新 gcc 库(在 /usr/local 中)时,此错误已修复。

因此,只需检查您构建的可执行文件及其链接的所有库即可

otool -L EXECUTABLE_OR_DYLIB
Run Code Online (Sandbox Code Playgroud)

如果您发现任何与较旧的 gcc 库链接的内容,请修复它。