Mac系统上openmp的编译问题:fatal error: ‘omp.h‘ file not found

Mac系统上openmp的编译问题:fatal error: 'omp.h' file not found


原因分析

最近在M2芯片的Mac上用Cmake编译openmp的并行c++程序时,遇到报错:

fatal error: ‘omp.h’ file not found.

用的是clang编译器,编译器版本如下:

截屏2023-12-17 18.16.22

主要原因是clang找不到openmp相关文件,所以我们可以在CmakeList.txt文件中指明相关路径。

解决方案

  1. 确保已经安装openmp,可以在命令行中输入一下命令安装

    brew install libomp
    
  2. 查询libomp安装位置

    brew --prefix libomp 
    

    我的路径为:/opt/homebrew/opt/libomp

  3. 然后在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

即可成功编译!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值