原因分析
最近在M2芯片的Mac上用Cmake
编译openmp的并行c++程序时,遇到报错:
fatal error: ‘omp.h’ file not found.
用的是clang编译器,编译器版本如下:
主要原因是clang找不到openmp相关文件,所以我们可以在CmakeList.txt文件中指明相关路径。
解决方案
-
确保已经安装openmp,可以在命令行中输入一下命令安装
brew install libomp
-
查询libomp安装位置
brew --prefix libomp
我的路径为:/opt/homebrew/opt/libomp
-
然后在CmakeList.txt文件中加入如下几行
# 设置 OpenMP 相关的变量 set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp") set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp") set(OpenMP_C_LIB_NAMES "omp") set(OpenMP_CXX_LIB_NAMES "omp") set(OpenMP_omp_LIBRARY "/opt/homebrew/Cellar/libomp/17.0.6/lib/libomp.dylib") # 将该路径替换为自己电脑中libomp.dylib路径 # 设置头文件搜索路径,同样替换路径 include_directories("/opt/homebrew/opt/libomp/include")
完整程序示例
我让ChatGPT写了一个openmp的示例程序,文件名为2.cpp
:
#include <iostream>
#include <omp.h>
const int N = 100000;
int main()
{
double a[N];
// 初始化数组
for (int i = 0; i < N; i++)
{
a[i] = i;
}
// 计算数组每个元素的平方
#pragma omp parallel for
for (int i = 0; i < N; i++)
{
a[i] = a[i] * a[i];
}
// 输出数组前10个元素
for (int i = 0; i < 10; i++)
{
std::cout << a[i] << std::endl;
}
return 0;
}
CmakeList.txt文件内容如下:
cmake_minimum_required(VERSION 3.12)
project(OpenMPExample)
# 设置 C++ 标准为 C++11
set(CMAKE_CXX_STANDARD 11)
# 设置 OpenMP 相关的变量
set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp")
set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp")
set(OpenMP_C_LIB_NAMES "omp")
set(OpenMP_CXX_LIB_NAMES "omp")
set(OpenMP_omp_LIBRARY "/opt/homebrew/Cellar/libomp/17.0.6/lib/libomp.dylib") # 将该路径替换为实际的 libomp 库路径
# 设置头文件搜索路径
include_directories("/opt/homebrew/opt/libomp/include")
# 查找 OpenMP 库
find_package(OpenMP REQUIRED)
# 添加可执行文件
add_executable(OpenMPExample 2.cpp)
# 如果找到 OpenMP 库,则添加链接
if(OpenMP_CXX_FOUND)
target_link_libraries(OpenMPExample PUBLIC OpenMP::OpenMP_CXX)
else()
message("OpenMP not found")
endif()
运行脚本,命名为run.sh
:
#!/bin/bash
# 删除之前的构建目录并重新创建
rm -rf ./build
mkdir build
cd build
# 使用 cmake 设置编译参数
cmake ..
# 使用 make 构建 OpenMPExample
make OpenMPExample
# 返回上级目录并运行生成的可执行文件
cd ..
./build/OpenMPExample
三个文件都构建好后,在这三个文件的目录下,命令行中运行:
sh run.sh
即可成功编译!