【问题标题】:Is C++ compilable with OpenMP and boost on MacOS?C++ 是否可以与 OpenMP 编译并在 MacOS 上进行增强?
【发布时间】:2018-04-15 08:56:02
【问题描述】:

我现在已经尝试了很多事情并得出了一些结论。也许,我监督了一些事情,但似乎我无法完成我想要的。

问题是:有没有可能在 MacOS High Sierra 上使用 OpenMP 和 boost 编译 C++?

一些发现(如果我错了,请纠正我):

  • Clang 支持 OpenMP,但 MacOS 随附的标准 MacOS-clang 编译器不支持,它也是 XCode9 唯一支持的编译器
  • g++ 支持 OpenMP
  • 如果我通过 homebrew 安装 Boost,那么它将使用 clang 编译器(不能轻易更改),因此将使用 libc++
  • g++默认使用libstdc++,不好改

因此,我似乎不能同时拥有这两者……只有在我使用 gcc 时才支持 OpenMP。但是 gcc 使用 libstdc++ 而不是 libc++,因此如果我尝试使用 libc++ 链接通过自制软件安装的 boost,则会出现链接器错误。

有没有机会让 OpenMP 和 boost 运行起来?

PS:请不要链接到一些 >1 岁的线程,XCode8 是另一个故事(早期的 XCode 版本支持不同的编译器),而 clang-omp 将是另一个故事(不再支持)。

【问题讨论】:

  • 使用 TBB 代替 OpenMP。
  • @manni66 一切都说明了这一点,我同意......不过,我想移植的软件进行了相当多的重构工作
  • 您的问题的答案是yesyes。您的发现表明了问题:不是标准 - 无法轻松 更改 - 不是容易 更改。现在对于 SO,教程请求是题外话,但您没有描述您似乎遇到的具体问题。
  • @Zulan 我不是在找教程,否则这个问题被关闭了。如果我所有的假设都是正确的并且我不监督任何事情,那么这就是我可以接受的问题的答案。不过,我还不能完全确定
  • 你为什么不用 gcc 自己构建Boost 呢?我希望这不是一项大任务。不确定它如何与“MacOS 随附的标准 MacOS-clang 编译器一起使用,这也是 XCode9 支持的唯一编译器”,您可以使用 gcc 吗?否则我根本不明白你为什么提到它

标签: c++ macos boost openmp


【解决方案1】:

标准 Apple 的 clang 支持 OpenMP。他们只是禁用了驱动程序选项。但是您可以通过这种方式使用前端选项: clang -Xclang -fopenmp <you_program> -L <path to libomp.a> -lomp

另外,您需要设置 DYLD_LIBRARY_PATH 环境变量: export DYLD_LIBRARY_PATH=<path to libomp.dylib>

【讨论】:

  • 您说,我可以在您发布的某些终端调用中使用前端选项...这会永久激活 OpenMP 吗?我需要 IDE 中的 OpenMP 选项
  • 这实际上是-fopenmp 驱动程序选项的作用。它将选项-fopenmp 发送到前端+ 添加一些额外的链接选项,例如libomp 的自动链接。您不能直接使用驱动程序选项。相反,您可以尝试使用前端选项。另外,您需要添加一些特殊选项以手动正确链接,即您正在做与驱动程序相同的工作。
  • 从(我认为)El Capitan 开始,以 DYLD_ 为前缀的环境变量不会传递给 shell 脚本。我没有解决办法!
【解决方案2】:

由于您顺便提到了brew install clang-omp,它已被合并到brew install llvm。如果您愿意,这确实是一个非常有用的选择,因为如果您需要,您可以获得 llvm 5 和 C++17。它使用标准选项(即-fopenmp)完全兼容 OpenMP。

您也可以尝试我的 brew 公式来使用内置的 clang,但您仍然需要像 Alexey Bataev 的回答那样设置自定义选项。使用 brew 安装:

brew install cliutils/apple/libomp

这只是添加了 openMP 动态库和头文件,没有别的。然后构建:

clang++ -Xpreprocessor -fopenmp -lomp <other arguments...>

请参阅readme。如果您使用 cmake,帮助文件 here 可能会有所帮助。

【讨论】:

  • 尝试安装时出现错误:No available formula with the name "cliutils/apple/omp"
  • 对不起@IceFire!它被称为 libomp。这就是cliutils/apple/libomp。我已经更正了上面的文字。
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
相关资源
最近更新 更多