OpenMP应用构建和运行指南
===============

HarmonyOS NDK中提供了OpenMP的动态库和静态库文件，支持开发者在Native应用中使用OpenMP。本文用于指导开发者在[DevEco Studio](https://developer.huawei.com/consumer/cn/deveco-studio/)中调用库文件使用OpenMP的并行化能力，更详细的使用示例和API标准请查看官方文档[clang-OpenMPSupport](https://clang.llvm.org/docs/OpenMPSupport.html)。

#### 开发步骤

#### \[h2\]创建Native C++工程

[创建NDK工程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/create-with-ndk)

#### \[h2\]添加依赖

OpenMP库的引入可以通过静态链接和动态链接两种方式实现。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/92/v3/MyaOiq7kSMyRu03qFBCUEg/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132823Z&HW-CC-Expire=86400&HW-CC-Sign=32328080E313FFB29412817CA15EC651999FACFA970FDD1F3AC6D940A01E5674)

[OMPT(OpenMP Tools Interface)](https://www.openmp.org/spec-html/5.0/openmpsu15.html#x25-240001.5.1)工具目前仅支持静态链接时使用。

**静态链接**

（1）打开entry/src/main/cpp/CMakeLists.txt，在target\_link\_libraries依赖中添加静态库libomp.a以及日志依赖libhilog\_ndk.z.so。

target\_link\_libraries(entry PUBLIC libomp.a libace\_napi.z.so libhilog\_ndk.z.so)

（2）打开entry/build-profile.json5，在buildOption->externalNativeOptions->cppFlags下添加编译参数"-static-openmp -fopenmp"。

"buildOption": {
    "externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "arguments": "",
      "cppFlags": "-static-openmp -fopenmp",
    }
  }

**动态链接**

（1）打开entry/src/main/cpp/CMakeLists.txt，在target\_link\_libraries依赖中添加动态库libomp.so以及日志依赖libhilog\_ndk.z.so。

target\_link\_libraries(entry PUBLIC libomp.so libace\_napi.z.so libhilog\_ndk.z.so)

（2）打开entry/build-profile.json5，在buildOption->externalNativeOptions->cppFlags下添加编译参数"-fopenmp"。

"buildOption": {
    "externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "arguments": "",
      "cppFlags": "-fopenmp",
    }
  }

（3）打开Sdk安装目录，在“{Sdk安装目录}{版本号}\\HarmonyOS\\native\\llvm\\lib\\aarch64-linux-ohos”目录下找到libomp.so动态库文件，并将其拷贝到工程目录entry/libs/arm64-v8a文件夹。

#### \[h2\]修改源文件

（1）修改entry/src/main/cpp/napi\_init.cpp，引入omp.h头文件，并添加OmpTest函数。

#include "napi/native\_api.h"
#include "omp.h"
#include "hilog/log.h"

#undef LOG\_DOMAIN
#undef LOG\_TAG
#define LOG\_DOMAIN 0x3200 // 全局domain宏，标识业务领域
#define LOG\_TAG "MY\_TAG"  // 全局tag宏，标识模块日志tag

static napi\_value OmpTest(napi\_env env, napi\_callback\_info info)
{

    OH\_LOG\_INFO(LOG\_APP, "=================Hello OpenMP test.====================");
    #pragma omp parallel
    {
        OH\_LOG\_INFO(LOG\_APP, "Hello OpenMP!");
    }
    return nullptr;
}

EXTERN\_C\_START
static napi\_value Init(napi\_env env, napi\_value exports)
{
    napi\_property\_descriptor desc\[\] = {
        { "ompTest", nullptr, OmpTest, nullptr, nullptr, nullptr, napi\_default, nullptr }
    };
    napi\_define\_properties(env, exports, sizeof(desc) / sizeof(desc\[0\]), desc);
    return exports;
}
EXTERN\_C\_END

static napi\_module demoModule = {
    .nm\_version = 1,
    .nm\_flags = 0,
    .nm\_filename = nullptr,
    .nm\_register\_func = Init,
    .nm\_modname = "entry",
    .nm\_priv = ((void\*)0),
    .reserved = { 0 },
};

extern "C" \_\_attribute\_\_((constructor)) void RegisterEntryModule(void)
{
    napi\_module\_register(&demoModule);
}

（2）修改entry/src/main/cpp/types/libentry/Index.d.ts，导出ompTest函数。

export const ompTest: () => null;

（3）Ts侧调用，修改entry/src/main/ets/pages/Index.ets，调用ompTest函数。

import testNapi from 'libentry.so';

@Entry
@Component
struct Index {
  @State message: string = 'Hello OpenMP';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            testNapi.ompTest();
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

#### \[h2\]运行并校验结果

运行前请检查设备连接并配置好[Signature](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)信息。直接点击右上角运行按钮，应用启动后设备进入“Hello OpenMP”界面，点击“Hello OpenMP”标签，打开DevEco Studio下方“Log”查看页面，即可看到并行打印的“Hello OpenMP！”消息。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c8/v3/DCfPiSarSauPj23hJZPKTg/zh-cn_image_0000002664329359.png?HW-CC-KV=V1&HW-CC-Date=20260709T132823Z&HW-CC-Expire=86400&HW-CC-Sign=51030EBA32062B47F31603A7BEEC579546DEA7ABBB843D77158803DD99B1C0E5)

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c/v3/CCcW2CHFRFuQo9ic9A24Lw/caution_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132823Z&HW-CC-Expire=86400&HW-CC-Sign=B2C284FC25B38341C18703FC441FE406F24A276A332525281B09BD85B528DD77)

OpenMP程序运行时，HiLog中会输出“dlopen\_impl load library header failed for libarcher.so”的报错信息（如下图）。该报错信息中提到的libarcher.so，在OpenMP程序开启Tsan检测时才需要使用。目前HarmonyOS未支持OpenMP程序的Tsan检测能力，因此该错误信息可忽略，不影响程序正常运行。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a9/v3/cY91BNxzSEGz7Wbxxz7GWw/zh-cn_image_0000002633850248.png?HW-CC-KV=V1&HW-CC-Date=20260709T132823Z&HW-CC-Expire=86400&HW-CC-Sign=69E32CBA52ACD3004AC802342511242142904DADF3CCA2B71FA1659231861F2D)