OS X 10.8,llvm,OpenMP with CMake

时间:2013-02-28 18:18:50

标签: 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而失败。

此致

2 个答案:

答案 0 :(得分:11)

LLVM是Apple在OS X中广泛使用的编译器框架(最值得注意的是在OpenGL实现中),而不是编译器本身。 Xcode中有两个LLVM前端 - 旧的基于GCC的前端llvm-gcc(支持OpenMP 2.5)和新的clang(不支持OpenMP)。 clang具有广泛的静态代码分析功能以及更好的错误报告功能,尤其是对于C ++代码。大多数情况下,这就是Apple投资并退出GCC的原因(另一方面,FreeBSD项目正在寻求以纯粹与许可相关的原因取代GCC)。正在进行的项目clomp(不要误解为英特尔的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)。

答案 1 :(得分:4)

只需在Hristo的优秀答案中添加几句话:您可以通过MacPorts安装gcc。这比用手编译所有内容要简单得多(从头开始编译gcc可能是非常重要的任务,因为依赖性等)。

所以,安装MacPorts,执行“sudo port install gcc47”,等待几个小时,你将以gcc-mp-4.7结束,它能够编译你的OpenMP代码。