我最近使用brew在我的macOS高Sierra上安装了OpenMP。
我可以使用 g++-9 轻松运行具有 OpenMP 指令的代码(类似于此处答案中的建议:在 Mac OS 上使用带有 C++11 的 OpenMP(。 但是,我需要将 OpenMP 功能添加到使用 OpenCV 的项目,并且我只能使用常规 g++ 进行编译(g++ —version
显示它是 4.2.1(。 我不打算使用任何可能使用 OpenMP 的 OpenCV 内置算法,只是想在同一程序中单独使用它们来优化我自己的一些图像处理算法。 如何使 OpenMP 能够与其他版本的 g++ 一起运行?执行以下操作:
g++ hello_world.cpp -fopenmp
给:
clang: error: unsupported option '-fopenmp'
Xcode附带的gcc
和g++
只不过是伪装的苹果的Clang:
$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
--> Apple clang version 11.0.3 (clang-1103.0.32.59) <--
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Clang的现代版本确实支持OpenMP,Apple的那个也支持OpenMP。但:
- 它不直接理解
-fopenmp
选项,尽管它列在clang --help
的输出中 - 它不提供 OpenMP 运行时
有一个针对 1 的解决方法。而不是-fopenmp
,传递-Xclang -fopenmp
。但这还不够 - 这将导致编译器无法找到omp.h
或产生缺少符号的链接错误。这是因为-Xclang -fopenmp
支持处理和转换 OpenMP 编译指示,但也需要 OpenMP 运行时。
对于 2,您可以从 Homebrew 安装libomp
- 英特尔 OpenMP 运行时的开源版本,现在是 LLVM OpenMP 运行时。我想,当您说"使用brew安装OpenMP"时,您实际上意味着您使用brew
安装了libomp
。
安装libomp
允许您编译 OpenMP 代码,因为/usr/local/include
(其中 Homebrew 符号链接omp.h
(位于编译器的包含路径上,但您必须显式链接库:
$ g++ -Xclang -fopenmp foo.cc -lomp
这是特定于Apple的Clang编译器的。通常,当您使用真正的GCC或Clang来编译和链接代码时,即,无需使用链接器链接一堆目标文件的单独步骤,-fopenmp
既可以处理OpenMP杂注,也可以告诉链接器链接OpenMP运行时,并且不需要指定-lomp
。