Xcode:未定义符号:_omp_get_max_threads

Xcode: Undefined symbol: _omp_get_max_threads

我正在尝试在 Xcode 11.4 的 C 中使用 openMP。我已经用 Homebrew 安装了 libomp,而 homebrew 显然将它安装在:/usr/local/Cellar/libomp/10.0.0/

下面的代码会生成链接器错误:未定义的符号:_omp_get_max_threads(get_thread_num 也是如此)。

#include <stdio.h>
#include "/usr/local/Cellar/libomp/10.0.0/include/omp.h"

int main () {
#pragma omp parallel
{
int threadNum = omp_get_thread_num ();
int maxThreads = omp_get_max_threads(); 
}
return 0; }

我尝试将 usr/local/Cellar 添加到 Header 搜索路径,并在我的 Xcode 项目中直接包含 omp.h,并添加编译标志 -openmp,行为不会改变。

1) 我找不到直接通过 Xcode 安装 OpenMP 的方法,这可能/更好吗?

2) Xcode 是否需要进一步执行操作才能识别安装了 Homebrew 的库?

3) 为什么 Homebrew 在 usr/local/Cellar 中安装库,这是一个不好的迹象吗?

4) 为什么缺少符号 _omp_get_max_threads 而不是 omp_get_max_threads

(edit):在usr/local/include下也有同样的三个headers、omp.h、ompt.h和omp-tools.h,如/usr/local/Cellar/libomp/10.0.0/.不知道为什么。

这是编译 C 或 C++ 项目并 link 在 Xcode 中支持 OpenMP 所需要做的。转到项目编辑器中的 Build Settings,select 项目节点,然后是 All 设置过滤器。进行以下更改:

  • Header Search Paths(在 Search Paths 组中)- 设置为(或添加 tp 现有值)/usr/local/include, 这样编译器就可以找到 /usr/local/include/omp.h
  • Library Search Paths(在 Search Paths 组中)- 设置为(或添加到现有值)/usr/local/lib, 这样 link 人就可以找到 /usr/local/lib/libomp.dylib

Select 目标可执行节点并进行以下附加更改:

  • 其他 C 标志(在 Apple Clang - 自定义编译器标志 组中)- 设置为(或添加)-Xclang -fopenmp 以启用编译器对 OpenMP 编译指示的处理
  • Other Linker Flags(在 Linking 组中)- 设置(或添加)-lomp 以启用 link使用 OpenMP 运行时库 libomp.dylib

您还可以在项目节点中进行所有四项更改,以在项目范围内或在目标节点中进行更改,具体取决于您的项目结构。

对于 C++ 项目,必须将 -Xclang -fopenmp 放入 Other C++ Flags.