macos - OS X 10.8、llvm、带有 CMake 的 OpenMP

标签 macos gcc llvm openmp

我刚刚升级到 OS X 10.8“Mountain Lion”,我开始后悔这样做了。

我不再能够构建使用 OpenMP 的(简单)并行代码。

通过四处查看,我了解到 Apple 不再使用“gcc”而是“llvm”——很可能是由于与许可证相关的问题。不幸的是,'llvm' 不(还?)支持 OpenMP。

我不敢相信许多基于 OpenMP 的程序将不再在 OS X 上运行,所以我的问题是:如何在 Mountain Lion 中启用 OpenMP?

在阅读了 Hristo Iliev 的精彩回答后,我想我错过的比我最初想象的要多。

我没有使用 XCode。该建筑基于 CMake 和 make/gcc。昨天我通过 macports 安装了 gcc 4.2,但是 - 截至今天 - 我的代码仍然是源代码形式,因为 - 由于一些奇怪的原因 - 我无法将编译切换到 gcc(与 OpenMP 相关的相同错误)。

现在的问题是 CMake 一直在使用 llvm 编译器。
在根 CMakeLists.txt 我添加了以下两行:

set(CMAKE_C_COMPILER "/opt/local/bin/gcc-apple-4.2")  
set(CMAKE_CXX_COMPILER "/opt/local/bin/gcc-apple-4.2")

我还添加了两个环境变量:
export CXX=/opt/local/bin/gcc-apple-4.2
export CC=/opt/local/bin/gcc-apple-4.2

当 CMake 尝试查找 OpenMP ( FIND_PACKAGE(OpenMP) ) 时,我得到以下输出:
-- The compiler is /opt/local/bin/gcc-apple-4.2
-- Try OpenMP C flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
[...]
CMake Error at /opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message):
Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS)
Call Stack (most recent call first):
/opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291    (_FPHSA_FAILURE_MESSAGE)
/opt/local/share/cmake-2.8/Modules/FindOpenMP.cmake:159 (find_package_handle_standard_args)
demo/CMakeLists.txt:8 (FIND_PACKAGE)

我试图运行 /opt/local/bin/gcc-apple-4.2手动,但由于缺少 libgomp 而失败。

问候

最佳答案

LLVM 是 Apple 在 OS X 中广泛使用的编译器框架(最显着的是在 OpenGL 实现中),而不是编译器本身。 Xcode 中有两个可用的 LLVM 前端——旧的基于 GCC 的前端 llvm-gcc (支持 OpenMP 2.5)和新的 clang (不支持 OpenMP)。 clang具有广泛的静态代码分析能力和更好的错误报告,尤其是 C++ 代码。大多数情况下,这就是 Apple 投资它并远离 GCC 的原因(另一方面,FreeBSD 项目正寻求用 clang 替换 GCC,纯粹是出于与许可相关的原因)。有一个正在进行的项目clomp (不要与 Intel 的 Cluster OpenMP 混淆)试图创建一个 OpenMP 感知版本的 clang ,但还远未成熟。

如果您不需要像显式任务这样的新 OpenMP 构造并且可以接受一些 bugs ,您仍然可以使用旧的 GCC 前端。只需将项目设置中的编译器套件切换到 LLVM GCC 4.2:

Compiler suite chooser

这个是基于真正古老的 GCC 4.2.1 并且似乎不再被开发。如果您需要更新版本的 GCC,只需 build one .不幸的是,我无法向您提供有关如何将其集成到 Xcode 中的信息。它在 GCC 4.7.1 和 OS X 10.8.2 的命令行上对我有用(我不经常使用 Xcode)。

关于macos - OS X 10.8、llvm、带有 CMake 的 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142725/

相关文章:

macos - 获取 Intellij 的工具栏

macos - 如何使用 Swift 输出到 STDERR?

c++ - 如何在 Windows 上使用 Vim 编译 C++ 代码?

gcc - ARM Cortex M4(Tiva C 系列 TM4C123GH6PM)启动时堆栈指针不加载

c++ - LTO 中的优化是否与正常编译中的相同?

windows - 在 Adob​​e AIR 中运行 native 程序

macos - 在 Xamarin 中使用 NSAppleEventsUsageDescription 获取登录项

c - 使用 GCC 中的 4 位 PowerPC CR0 寄存器

c++ - LLVM 有后端优化器吗?

iphone - 我应该在 ubuntu 上为 iphone-dev 构建 llvm 吗?