使用gcc-4.7和openMP时缺少___emutls_get_address函数

10

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

使用-fopenmp编译的任何程序,包括MWE,都会存在这个问题。

#include <stdio.h>

int main() {
  #pragma omp parallel
  printf("Hallo!\n");
  return 0;
}

请注意,What is the "___emutls_get_address" symbol?中提出的解决方案,即在链接阶段添加-lgcc_eh,并不能解决问题(我仍然收到相同的dyld错误消息)。


奇怪,我最近按照这个指南在OS X 10.8.2上编译了GCC 4.7.1,并且OpenMP支持完美运行。 - Hristo Iliev
@HristoIliev 我会再次检查我是如何编译它的,并尝试重新编译。希望问题消失... - Marco Lombardi
类似的问题和答案已经发布在这里:https://dev59.com/dWsz5IYBdhLWcg3weHgA - FabienRohrer
将 org.deeplearning4j 的版本从 1.0.0-beta5 升级到 1.0.0-beta6 后,一切正常。 - Oleksii Kyslytsyn
2个回答

9

我也曾经遇到过完全相同的问题。 我对openMP很新,我的技术水平不够好以使用Michal Fapso提供的解决方案。 我通过使用___解决了这个问题。

brew link --overwrite gcc

问题已经解决!

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


3

我曾经遇到过完全相同的问题。在我的情况下,它是由于链接到一个库(我不记得是哪个)导致的,这个库是由XCode安装的旧版本gcc的库,位于/usr/lib。当我纠正它以链接到我用于编译的较新版本gcc库(位于/usr/local)时,此错误被修复。

因此,只需检查您构建的可执行文件以及所有链接的库,使用以下命令:

otool -L EXECUTABLE_OR_DYLIB

如果你发现与旧版gcc库相关的任何内容,请进行修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接