如何在OS X中包含omp.h?

35

我是C语言的新手,在OS X上编译我的代码遇到了一些问题。

我经常使用Eclipse编写Java,并使用终端编译我的代码。然而,现在我正在学习openMP并且遇到了麻烦。

首先,我下载了Xcode来编写openMP代码,但它无法识别<omp.h>。然后我安装了g++。当我在终端中输入g++ -v时,我得到了这个输出:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

但是当我使用g++ Mesh.cpp -fopenmp时,我仍然会得到

Mesh.cpp:4:10: fatal error: 'omp.h' file not found
#include <omp.h>
         ^
1 error generated.

然后我尝试将PTP安装到我的Eclipse中,但遇到了同样的问题。 我认为我的MacBook中没有omp.h文件,所以我搜索了一下,在gcc-4.9.1/build/文件夹下找到了几个包含omp.h的文件夹。

问题来了。基于Java的经验,我拥有文件却无法使用它的唯一原因是类路径错误。但是,我不知道如何在g++、Xcode或Eclipse中更改此配置。但既然我可以像<stdio.h>那样包含文件并在所有IDE中编译它,为什么我不能用<omp.h>做同样的事情呢?

我注意到的另一件事是gcc文件夹版本是4.9.1,但是当我在终端中输入gcc -v与输入g++ -v时得到相同的结果。

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

版本信息难道不应该包含有关4.9.1的信息吗?就像java -version所显示的那样。

java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

谢谢阅读。感激任何帮助。

6个回答

54

这个命令可以帮助你

brew install libomp

brew info libomp
libomp: stable 6.0.1 (bottled)
LLVM's OpenMP runtime library
https://openmp.llvm.org/
/usr/local/Cellar/libomp/6.0.1 (12 files, 1.2MB) *
  Poured from bottle on 2018-11-20 at 16:12:22
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/libomp.rb
==> Dependencies
Build: cmake ✘
==> Requirements
Required: macOS >= 10.10 ✔
==> Caveats
On Apple Clang, you need to add several options to use OpenMP's front end
instead of the standard driver option. This usually looks like
  -Xpreprocessor -fopenmp -lomp

You might need to make sure the lib and include directories are discoverable
if /usr/local is not searched:

  -L/usr/local/opt/libomp/lib -I/usr/local/opt/libomp/include

For CMake, the following flags will cause the OpenMP::OpenMP_CXX target to
be set up correctly:
  -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp -I/usr/local/opt/libomp/include" -DOpenMP_CXX_LIB_NAMES="omp" -DOpenMP_omp_LIBRARY=/usr/local/opt/libomp/lib/libomp.dylib

2
欢迎。它是做什么的?它将如何帮助您?请查看[答案]并参加欢迎[导览]。 - Vladimir F Героям слава
8
对于使用 homebrew 的用户,这是实际的解决方案。 - Gil Tomás
我从9年后回来了。这个问题有82k的浏览量,所以对于那些使用homebrew的人来说,这就是答案。 - undefined

18

虽然 MacOS 中似乎包含该库,但如果您仅使用以下内容,则 XCode 无法找到它:

#include <omp.h>

但是,如果您没有安装该库,您可以通过使用HomeBrew安装它来简单地添加它:

brew install libomp

完成此操作后,只需将库包含代码替换为以下内容:

#include "/usr/local/opt/libomp/include/omp.h"

或者是在使用brew安装libomp后终端显示给您的路径。


如果我们想要使代码平台跨兼容,该怎么办? - dcxst

16

GCC 4.9.1在通常情况下不随OS X附带安装(实际上,现在没有任何GCC与Xcode一起出售)。你必须通过其他方式进行安装,例如Homebrew或者像这里描述的自行编译。你可能缺少的是正确设置的PATH变量,或者额外安装的编译器具有版本后缀二进制文件,即gcc-4.9g++-4.9而不仅仅是gcc / g++

正如@rubenvb已经提到的,Apple将Clang可执行文件符号链接到类似GCC的名称。我个人认为这是一个糟糕的做法,因为最近的Xcode附带的Clang版本会对未识别的命令行选项(例如GCC前端特定选项)产生严格的错误。


我按照你提供的链接精确安装了GCC,但它仍然无法工作... - user3928256
如果您按照链接页面上的说明进行操作,则您的编译器名称为g++-4.9,除非您安装在/usr/local/bin中,否则必须显式添加其路径。此外,您需要重新配置PTP以调用g++-4.9而不是g++ - Hristo Iliev
1
谢谢!在输入“export PATH=/usr/gcc-4.9.1/bin:$PATH”之后,我现在可以使用“g++-4.9”了。 - user3928256

13
gccg++ 命令在 XCode 中并不是你想象的那样:苹果公司认为将 Clang 伪装成 GCC 可以使过渡更加平稳。
Clang 对 OpenMP 的支持仍在开发中。如果我没有错过任何 WIP 代码的重大发布,您需要构建这个版本的Clang并使用它。
当然,您也可以通过像 homebrew 或 macports 这样的工具安装真正的GCC,这将带有OpenMP支持。

3
基本上问题是我的笔记本电脑中的 GCC 是被 Clang 模拟的假的吗?因为后者不支持 openMP,所以导致了所有的问题?谢谢。 - user3928256
@user3928256 是的,你执行的 gcc 命令是由 XCode 提供的,实际上就是 Clang。我确实错过了你问题中提到安装 GCC 4.9.1 的部分。所以,如果你按照 @Hristo 的描述设置了你的 PATH,那么应该没问题了。 - rubenvb
从链接的网站更新:OpenMP支持在clang/llvm编译器中的开发活动已经转移到www.llvm.org。请获取支持OpenMP的clang(OpenMP 3.1在clang/llvm 3.7中得到完全支持),并在那里为其进一步发展做出贡献。此网站仅用于档案目的而维护。 - Bryn Keller
2
如果你运行 brew install gcc,你可以使用 gcc-6 来运行真正的 gcc。说真的,苹果这个有点奇怪... - Thomas Ahle

6

omp.h 文件已经被移动到一个子目录中。我在MacPorts中找到了它,并通过创建一个链接来解决这个编译问题:

sudo ln -s /opt/local/include/libomp/omp.h /opt/local/include/omp.h

2
MacPorts有一个变体:sudo port install libomp +top_level - Karolis Koncevičius

2
如果您正在使用M1芯片,请在此处安装libomp /opt/homebrew/Cellar/,安装完成后,您需要手动链接libomp。我已经安装了brew install libomp,得到了libomp 14.0.0。使用以下命令可能会对您有所帮助。
 g++ -Xpreprocessor -fopenmp  -I/opt/homebrew/Cellar/libomp/14.0.0/include -L/usr/local/lib -lomp  *.cpp -o main

1
我必须从项目文件夹中运行 ln -s /opt/homebrew/Cellar/libomp/14.0.5/include/omp.h omp.h - Kyle Ridolfo

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