我最近使用brew在我的macOS high Sierra上安装了OpenMP。
我可以使用g ++-9轻松运行具有OpenMP指令的代码(类似于此处答案中的建议:Using OpenMP with C++11 on Mac OS)。但是,我需要向使用OpenCV的项目中添加OpenMP功能,并且只能使用常规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的也支持。但是:
-fopenmp
的输出中列出,但它不直接理解clang --help
选项>有一种针对1.的解决方法,而不是-fopenmp
,请传递-Xclang -fopenmp
。但这还不够-它将导致编译器无法找到omp.h
或产生链接错误并缺少符号。这是因为-Xclang -fopenmp
允许处理和转换OpenMP编译指示,但也需要OpenMP运行时。
对于2,您可以从Homebrew-英特尔OpenMP运行时的开源版本(现在为LLVM OpenMP运行时)安装libomp
。我猜,当您说“使用brew安装OpenMP”时,实际上是指您使用libomp
安装了brew
。
已安装libomp
,因此您可以编译OpenMP代码,因为/usr/local/include
(其中Homebrew符号链接omp.h
在编译器的包含路径上,但是您必须显式链接库:
$ g++ -Xclang -fopenmp foo.cc -lomp
这是特定于Apple的Clang编译器。通常,当您使用GCC或Clang来编译和链接代码时,即,没有使用链接器链接一堆目标文件的单独步骤,
-fopenmp
既可以处理OpenMP编译指示,也可以告诉链接器链接OpenMP运行时。