【问题标题】:OSX 10.12 GCC OpenMP ErrorOSX 10.12 GCC OpenMP 错误
【发布时间】:2017-04-24 18:09:00
【问题描述】:

一直在尝试在 OSX 10.12 上编译和运行一个简单的 OpenMP 程序(Hello World)。我使用 brew 安装了 gcc 6。 我一直在使用“-fopenmp”标志进行构建。 该程序编译正常,但是当我尝试执行该程序时,我得到以下信息:

dyld: lazy symbol binding failed: Symbol not found: ___emutls_get_address
  Referenced from: /usr/local/opt/gcc/lib/gcc/6/libgomp.1.dylib (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: ___emutls_get_address
  Referenced from: /usr/local/opt/gcc/lib/gcc/6/libgomp.1.dylib (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

Abort trap: 6

有什么想法吗?

【问题讨论】:

  • 我认为您需要使用brew rm gcc 删除您的gcc 并使用brew install gcc --without-multilib 重新安装。
  • 这方面有进展吗?
  • @MarkSetchell 我试过了,但没有运气。
  • 另一件事...尝试启动 Xcode 并运行更新 - 或者更好的是,卸载并重新安装 Xcode 并重新运行 xcode-select --install

标签: c macos gcc openmp


【解决方案1】:

这是一个在我的 iMac 上运行 g++-6 的示例,编译如下:

g++-6 -std=c++11 -fopenmp -O3 demo.cpp -o demo

运行如下:

./demo
Time: 4.132ms, 1000000 elements.

代码如下:

#include "omp.h"
#include <iostream>
#include <cmath>
#include <cstdio>
#include <chrono>

int main()
{
   const int size = 1000000;
   int i;
   double sinTable[size];
   std::chrono::time_point<std::chrono::high_resolution_clock> start = std::chrono::high_resolution_clock::now(); 

   #pragma omp parallel for
   for(int n=0; n<size; ++n)
      sinTable[n] = sqrt(std::sin(2 * M_PI * n / size));

   std::chrono::time_point<std::chrono::high_resolution_clock> end = std::chrono::high_resolution_clock::now();
   std::uint64_t duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
   float ms=duration/1000000.0;
   std::cout << "Time: " << ms << "ms, " << size << " elements." << std::endl;
}

【讨论】:

  • 所以,您已经卸载了 Xcode,卸载了 g++ 并重新安装了 Xcode 并重新安装了它的命令行工具并使用--without-multilib 选项安装了 g++ 并重新编译了上面的代码,它仍然失败?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多