
鸿蒙NEXT开发【编译构建常见问题】
编译构建时,内存或CPU占用过高,导致出现DevEco Studio运行卡顿、延迟等现象。
如何解决编译过程内存过高
问题现象
编译构建时,内存或CPU占用过高,导致出现DevEco Studio运行卡顿、延迟等现象。
解决措施
-
在并行模式下执行hvigor构建,默认会有5个worker线程同时执行编译,且在编译的过程中,会在内存中添加一些缓存对象,用于提高后续增量编译的效率。
可以在hvigor-config.json5中添加配置。
"properties": {
// 配置为0,表示不启用内存缓存配置,默认为4,数值越低,内存中缓存数据越少
"hvigor.pool.cache.capacity": 0,
// 默认配置为cpu核数-1, 包含ohos.arkCompile.maxSize4,值越小,占用内存越少
"hvigor.pool.maxSize" : 5,
// 默认配置值为5, 值越小,占用内存越少
"ohos.arkCompile.maxSize": 3,
// 默认配置值为true, 表示开启内存缓存,占用内存较多,配置为false,关闭内存缓存,占用内存较少
"hvigor.enableMemoryCache": false
},
说明
当配置项"hvigor.pool.maxSize"和"ohos.arkCompile.maxSize"的值改小,"hvigor.enableMemoryCache"改为false后,可能会导致编译时长增加,请耐心等待。
-
如果以上修改没有取得明显的效果,可以使用非并行的模式来执行编译。
-
在菜单栏点击“File > Settings > Build, Execution, Deployment > Build Tools > Hvigor”,取消勾选“Execute tasks in parallel mode (may require larger heap size)”。
-
流水线场景中,在命令行最后增加 --no-parallel,示例:
hvigorw assembleHap --no-parallel
说明
使用非并行模式编译,内存占用会减少,但可能会导致编译时长增加,请耐心等待。
-
构建报错“Cannot read properties of undefined(reading ‘xxx’)”
问题现象
编译构建时,出现报错“Cannot read properties of undefined(reading ‘xxx’)”。
解决措施
打开堆栈信息排查hvigorconfig.ts文件和hvigorfile.ts文件里的代码,里面是否使用了未定义的属性。
堆栈打开方法:项目根目录/hvigor/hvigor-config.json5文件中配置如下内容:
"debugging": {
"stacktrace": true /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */
},
如果上述文件中并未排查出问题,请及时向我们提单反馈。
请按照如下步骤进行操作:[提单链接],在线提单->HarmonyOS应用->应用工具平台->DevEco Studio。
构建报错“Duplicated files found in module xxx. This may cause unexpected errors at runtime”
问题现象
编译构建时,出现报错“Duplicated files found in module xxx. This may cause unexpected errors at runtime”。
问题原因是构建时存在不同版本的同名so文件。比如将har模块产物里的so文件拷贝到entry模块的libs目录下,这时har模块里有一个libhar.so,entry模块里也有一个libhar.so,再配置entry依赖har,构建entry就会出现报错。
解决措施
使用select、pickFirsts、pickLasts等配置选中要使用的so文件; select提供native产物的精准选择能力,优先级高于excludes、pickFirsts等配置项。pickFirsts、pickLasts按照.so文件的优先级顺序,打包最高优先级的.so文件,优先级顺序是指依赖收集的顺序,越晚被收集优先级越高。
基于上面的例子,可以在entry的build-profile.json5中添加配置select选中har模块中的so文件,package选中包名为“har”的模块, include选中“libhar.so”文件。
构建报错“input module releaseType is different”
问题现象
打包APP时,提示“input module releaseType is different”。
解决措施
根据报错日志的Warning信息所提示的模块名称,检查模块间的apiReleaseType字段是否一致。
该apiReleaseType字段由编译构建工具自动生成,保存在HAP/HSP包的module.json文件中。如下图所示,首先确认各模块间该字段是否一致,如果存在不一致的情况,需要将应用的各个模块,使用相同版本的SDK重新打包,然后打包APP。
构建报错“debug is different”
问题现象
打包APP时,提示“debug is different”。
解决措施
根据报错日志的Warning信息所提示的模块名称,检查模块间的debug字段是否一致,尤其需要关注本地模块和外部引用模块之间是否一致。
1.该debug字段由编译构建工具自动生成,保存在HAP/HSP包的module.json文件中,如下图所示,首先确认各模块间该字段是否一致。
2.编译工具根据设置的Build Mode选项生成debug标识,如图所示,可以通过此处进行设置。
构建报错“proxy data is duplicated”
问题现象
打包APP时,提示“uri datashareproxy://bundleName/** in proxy data is duplicated”。
解决措施
proxyData标识模块提供的数据代理列表,只允许entry和feature配置,不同的proxyData中配置的URI不可重复。遇到此问题,检查模块间是否配置了相同uri的proxyData。
编译报错“Init keystore failed: parseAlgParameters failed: ObjectIdentifier()”
问题现象
编译构建时,出现错误:Init keystore failed: parseAlgParameters failed: ObjectIdentifier()。
hap-sign-tool: error: ACCESS_ERROR, code: 109. Details: Init keystore failed: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48) Detail: Please check the message from tools
错误原因
使用高版本JDK生成密钥对(p12),再使用低版本的JDK执行签名命令时,会因为不兼容导致解析p12失败,从而签名失败。
场景
- 使用DevEco Studio生产密钥对时,DevEco Studio默认会调用软件内预置的JDK17,而用户使用本地的低版本JDK进行签名时则会报错。
- 用户本地使用高版本JDK生成密钥对时,又通过DevEco Studio进行签名,DevEco Studio中预置的JDK17版本低于用户的JDK,导致报错。
解决方案
请检查当前使用的JDK版本和生产密钥对使用的JDK版本,使用版本匹配的JDK执行签名命令。
编译报错“generate SignerBlock failed”
问题现象
编译构建时,出现错误:message:generate SignerBlock failed。
hap-sign-tool: error: {errorcode:0,message:generate SignerBlock failed}
错误原因
签名用的公私钥对不匹配,使用私钥签名后,用公钥验签失败。需保证私钥(keyalias)和公钥(appCertPath)配对使用。
场景
- 本地生产签名材料时,未导出正确的keyalias对应的csr(证书请求文件),导致生成证书时,公钥与keyalias对应的私钥不匹配。
- 签名过程参数填写错误,使用了错误的keyalias或者appCertPath文件。
解决方案
请选择正确、配对的keyalias和appCertPath文件。
编译报错“java.io.IOException: DerValue.getOID, not an OID 49”
问题现象
编译构建时,出现错误:java.io.IOException: DerValue.getOID, not an OID 49。
hap-sign-tool: error: ACCESS_ERROR, code: 109. Details: java.io.IOException: DerValue.getOID, not an OID 49 Detail: Please check the message from tools
报错原因
证书文件解析失败,找不到证书的OID。
场景
- 证书被篡改。
- appCertPath参数中传入了非证书文件。
解决方案
请检查证书文件是否正确。
编译报错“JS heap out of memory”
问题现象
编译构建时,出现报错“JS heap out of memory“。
解决措施
出现该报错的原因是hvigor运行时内存不足,在使用3.1.0及以上版本的hvigor时,可通过以下方式修改hvigor运行时内存的最大值。
勾选Enable the Daemon for tasks:
在hvigor-config.json5中修改maxOldSpaceSize字段,根据工程的大小,适当将其增大(如设置为8192):
"nodeOptions": {
"maxOldSpaceSize": 8192
}
Linux环境下编译报错“JS heap out of memory”
问题现象
在Linux环境下,系统内存有64G,Hvigorw脚本中配置–max-old-space-size=40960,在编译构建时,实际在使用内存未达到配置的内存(例如使用到20G左右)就出现报错“JS heap out of memory“。
FATAL ERROR: NewSpace::Rebalance Allocation failed - JavaScript heap out of memory
Writing Node.js report to file: report.20200512.172528.47517.24.011.json
Node.js report completed
1: 0xa295e0 node::Abort() [node]
2: 0x9782df node::FatalError(char const*, char const*) [node]
3: 0xb99c2e v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, bool) [node]
4: 0xb99fa7 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [node]
5: 0xd3a3b5 [node]
6: 0xd74f27 [node]
7: 0xd84707 v8::internal::MarkCompactCollector::CollectGarbage() [node]
8: 0xd481b9 v8::internal::Heap::MarkCompact() [node]
9: 0xd48f0b v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node]
10: 0xd499a5 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
11: 0xd4aebf v8::internal::Heap::HandleGCRequest() [node]
12: 0xcf5f97 v8::internal::StackGuard::HandleInterrupts() [node]
13: 0x104b803 v8::internal::Runtime_StackGuard(int, unsigned long*, v8::internal::Isolate*) [node]
14: 0x13a5a99 [node]
Aborted (core dumped)
问题原因
vm.max_map_count是一个与内核虚拟内存子系统相关的参数,用于控制进程可以拥有的内存映射区域的最大数量。它通常用于限制一个进程可以打开的文件数量,特别是在使用大量内存映射文件的情况下。
在Linux系统上,vm.max_map_count参数的默认值通常是较小的数值,例如65530。然而,对于一些需要大量内存映射的应用程序或者特定的使用场景,可能需要增加该参数的值,以便支持更多的内存映射区域。
解决措施
修改vm.max_map_count的值:
-
临时修改:
sysctl -w vm.max_map_count=新值
-
永久修改:如果希望永久修改参数的值,可以编辑/etc/sysctl.conf文件,并添加或修改以下行:
vm.max_map_count=新值
保存文件后,使用以下命令使更改生效:
sysctl -p
编译报错“Cannot find module XXX or its corresponding type declarations”
-
场景一:
问题现象
Stage模板工程编译引用native文件(.so) 提示 “Cannot find module XXX or its corresponding type declarations.”。
处理措施
当前Stage工程在编译构建阶段新增对native文件(.so)导出符号的语法校验,如果引用了没有对应声明文件(.d.ts)的native文件(.so)的现有工程在编译构建阶段,语法校验工具便会报错提示找不到对应的声明文件。
如果出现类似问题,可尝试通过如下方式进行解决:
-
在对应cpp目录下新建types/libxxx目录,并在该目录下新增index.d.ts用于声明native的类型符号;新增oh-package.json5配置文件用于校验工具的模块查询。
-
在native引用的模块内的oh-package.json5中添加native模块的本地依赖,并根据IDE提示点击Sync Now同步工程,下图以entry模块引用native模块为例。
-
-
场景二:
问题现象
引用三方包,构建失败,提示“Cannot find module ‘xxx’ or its corresponding type declarations”。
处理措施
进入对应模块级oh-package.json5文件或工程级oh-package.json5文件中查看三方包是否已安装,若未安装,需执行ohpm install安装;若已安装,需查看“main”字段是否配置正确,若未配置或配置错误,需配置为正确的入口文件。
-
场景三:
问题现象
引用的包路径被混淆,代码中又是在引用包后面拼接了路径,导致模块引用不到而报错。
例如:
代码中这样引用
这样引用会找不到模块,导致报错。处理措施
修改引用方式,改为推荐的引用方式。
-
场景四:
问题现象
被引用模块oh_package.json5配置有误,执行了ohpm install 并且成功地安装了依赖,但是还报错模块找不到。
被引用模块的 oh_package.json5 中配置了错误的types字段。
该字段优先于main字段。 如果 types 字段配置的不存在,就会报错模块找不到。
处理措施
如果该包中没有d.ets声明,则这个字段可以删除。配置不存在或者错误,会导致报错。
-
场景五:
问题现象
oh_package.json5 中 dependencies 中引入模块的 名称 和 实际使用时 import 的 不一致。
例如 在 oh_package.json5 中这样引入:
"dependencies": { "har": "file:../har" }
但是实际上在代码中import 的时候是 大写 HAR 或者其他而不是 dependencies 里面配置的 ‘har’ 的值,要注意保持完全一致。(目前windows 没有问题,linux会报错模块找不到)
处理措施
引入和使用改成一致。
-
场景六:
问题现象
引用模块的 oh_package.json5 中 main 字段值和实际的文件名称大小写不一致。
处理措施
将main字段和实际文件名称的大小写改为一致。
-
场景七:
问题现象
Stage模板工程编译构建失败,提示 “Cannot find module ‘@bundle:rollup_plugin_ignore_empty_module_placeholder’ or its corresponding type declarations”。
解决措施
该问题是由于工程引用了无对应实现文件的.d.ts声明文件:
-
通过在build目录中搜索’rollup_plugin_ignore_empty_module_placeholder’,找到报错的中间文件,并根据中间文件找到对应工程文件。
在输入栏中输入rollup_plugin_ignore_empty_module_placeholder,找到问题模块的中间文件。
-
在引用类型文件中通过添加type显式声明符号类型引用:
export type {T} from './type';
-
同时排查是否从d.ts/d.ets中引用值类型符号,禁止在声明文件中声明值变量。
-
编译报错“Module ‘xxx’ has no exported member ‘yyy’”
问题现象
Stage模板工程编译构建失败,提示 “Module ‘xxx’ has no exported member ‘yyy’” 并且"yyy"符号是由export * from 'x.js’语法从js文件中导出。
处理措施
当前Stage工程编译构建期的语法校验工具对js文件不作检查,因此当使用export * from 'x.js’导出js文件中的符号时,符号引用处便会提示"Module ‘xxx’ has no exported member ‘yyy’"的错误信息。
如果出现类似问题,可尝试通过如下方式进行解决:
-
方法1(推荐使用): 使用符号显式导出语法,从js文件中re-export符号 。
export { yyy } from 'x.js'
-
方法2:新增x.js对应的声明文件(.d.ts),并在引用时不指定后缀。
编译报错“Could not load ${file1} (imported by ${file2}): Maximum call stack size exceeded”
问题现象
Stage模板工程编译构建失败,提示 “ERROR: Could not load ${file1} (imported by ${file2}): Maximum call stack size exceeded”。
处理措施
该问题是由于file1为当前工程外的代码:
请新建Static Library模块,并将工程外的代码迁移至Static Library模块内,并使用HAP引用HAR方式进行模块间引用。
编译报错“Failed to get a resolved OhmUrl by filepath xx”
-
场景一:
问题现象
三方包在配置依赖时,配置到devDependencies,源码中又有引用依赖中的API时,编译失败。如以下示例:三方包@hms-security/ucs-appauth将依赖@network/gr配置在devDependencies中,源码中使用了@network/grs的API时,编译失败,提示“ERROR: ArkTS:ERROR Failed to get an resolved OhmUrl by filepath xxx”。
问题确认
-
进入上面报黄色的源码文件中,可以看到依赖有红色告警信息。
-
进入包下的oh-package.json5文件,查看依赖配置为devDependencies。
处理措施
- 向此包开发团队提改进建议:运行时的依赖,不能配置在devDependencies中。
- 可在依赖上层引入对应devDependencies中的三方包规避此问题。
-
-
场景二:
问题现象
DevEco Studio编译失败,提示“ERROR: ArkTS:ERROR Failed to get a resolved OhmUrl by filepath xxx”。
问题确认
查看工程目录下的build-profile.json5文件中modules字段配置的srcPath路径是否与真实路径不相同,是否存在大小写不一致问题。
处理措施
将工程目录下的build-profile.json5文件中modules字段配置的srcPath路径与真实路径保持一致。
-
场景三:
问题现象
工程A以相对路径引用了工程B的模块,这种引用会导致报错。
处理措施- 把工程B这种的har转至工程A里,作为A的一个模块引用。
- 把工程B的har提前打包,在A中 以.har的方式引用。
- 上传到仓库,以版本号的方式引用。
-
场景四:
问题现象
DevEco Studio编译失败,提示“Error Message: Failed to get a resolved OhmUrl for ‘hvigor_ignore_xxxxx’ imported by xxx”。
处理措施
如果hvigor_ignore_xxxxx所在的模块是一个har模块,需要排查oh_package.json5中是否存在"packageType": “InterfaceHar”,如果存在,请删除"packageType": “InterfaceHar”。
-
场景五:
问题现象
DevEco Studio编译失败,提示“Failed to get a resolved OhmUrl for ‘xxx’ imported by ‘yyy’”。
问题确认
- 排查yyy所在模块是否为字节码har,查看工程级build-profile.json5的useNormalizedOHMUrl是否为true(缺省默认值为false),如果为true则默认构建字节码har。
- 如果yyy所在模块是字节码har,请排查xxx依赖是否被配置在工程级oh_package.json5的dependencies,但没有配置在yyy模块级oh_package.json5的dependencies中。
处理措施
-
将xxx依赖配置到yyy模块oh_package.json5的dependencies中。
-
将yyy模块改为非字节码har,在模块级build-profile.json5文件中添加byteCodeHar字段并设置为false。
"buildOption": {
"arkOptions": {
"byteCodeHar": false
}
}
-
场景六:
请确认当前使用的DevEco Studio和SDK版本是配套的,点击菜单栏Help > About DevEco Studio,Help > About HarmonyOS SDK分别查看配套的DevEco Studio和SDK版本。
-
场景七:
问题现象:
DevEco Studio编译失败,提示 “ERROR: ArkTS:ERROR failed to execute es2abc ERROR: ArkTS:ERROR Failed to get a resolved OhmUrl by filepath xxx”。
处理措施
该问题是由于在工程中引用了非工程标准模块目录(即目录内无模块描述文件module.json5),如下图utils目录所示:
请新建Static Library模块,并将utils/common里面的代码迁移至Static Library模块内,并使用HAP引用HAR方式进行模块间引用。
编译报错“Property xxx does not exist on type ‘typeof BuildProfile’.”
问题现象 1
使用了自定义参数BuildProfile,编译态无异常但编译构建失败,提示“Property xxx does not exist on type ‘typeof BuildProfile’.”。
处理措施
检查在当前模块下build-profile.json5中的targets > buildProfileFields配置的自定义参数中key值是否相同,如果不同请将targets内所有buildProfileFields中的key值保持相同。
以下为导致编译报错的错误配置示例:
"targets": [
{
"name": "default",
"config": {
"buildOption": {
"arkOptions": {
"buildProfileFields": {
"targetName": "default"
}
}
}
}
},
{
"name": "default1",
"config": {
"buildOption": {
"arkOptions": {
"buildProfileFields": {
"targetName1": "default1"
}
}
}
}
},
]
请将targets内所有buildProfileFields中的key值修改一致,如以下示例:
"targets": [
{
"name": "default",
"config": {
"buildOption": {
"arkOptions": {
"buildProfileFields": {
"targetName": "default"
}
}
}
}
},
{
"name": "default1",
"config": {
"buildOption": {
"arkOptions": {
"buildProfileFields": {
"targetName": "default1"
}
}
}
}
},
]
问题现象2
使用了自定义参数BuildProfile并且编译器标红且构建失败,提示“Property xxx does not exist on type ‘typeof BuildProfile’.”。
处理措施
请检查当前模块下build-profile.json5中buildProfileFields内是否添加了所使用的自定义参数,请确保该自定义参数已配置在buildProfileFields内。
C++工程编译导致电脑卡顿的处理建议
问题现象
在执行代码规模较大的C++工程的编译时,由于C++编译时的CPU占用率较高,可能出现电脑卡顿、反应迟缓等现象。
处理措施
如果出现类似问题,可尝试通过如下方式进行解决:
打开模块下的build-profile.json5文件,在arguments参数中添加如下配置。并根据电脑CPU配置,修改compile和link的值。建议compile和link的值之和,设置为CPU核数的一半,如CPU为8核,则compile和link分别设置为2。
"arguments": "-DCMAKE_JOB_POOL_COMPILE:STRING=compile -DCMAKE_JOB_POOL_LINK:STRING=link -DCMAKE_JOB_POOLS:STRING=compile=2;link=2",
需要说明的是,修改了compile和link的值,可能会导致编译时长增加,请耐心等待。
CPP编译报错"A ‘undefined symbol’ error has occurred"
问题现象
在编译HarmonyOS C++ 项目时,报错提示"A ‘undefined symbol’ error has occurred"。
解决措施
"undefined symbol"错误通常表示链接器找不到特定符号的定义。这通常是因为源文件没有正确编译或链接,或者因为缺少必要的库文件。以下是如何定位和解决这个问题的步骤:
- 确保所有源文件都已包含在 CMake 构建中。
首先,检查您的 CMakeLists.txt 文件,确保所有相关的源文件都已包含在项目中。
示例 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include)
# 添加所有源文件
add_library(myProgram SAHRED main.cpp myLibrary.cpp)
- 确认源文件的符号定义。
确保在所有相关的源文件中正确定义了符号。例如,检查 myLibrary.cpp 是否包含 myFunction 的定义:
myLibrary.cpp
#include "myLibrary.h"
void myFunction() {
// Function implementation
}
myLibrary.h
#ifndef MY_LIBRARY_H
#define MY_LIBRARY_H
void myFunction();
#endif
- 检查编译和链接顺序。
确保所有源文件和库文件按照正确的顺序进行编译和链接。CMake 和 Ninja 通常会处理这个问题,但在手动编译时可能会出现问题。
- 清理和重新生成构建文件。
有时,构建文件可能会损坏或丢失符号定义。尝试清理构建目录并重新生成构建文件:
hvigorw clean 1
或手动删除模块下.cxx目录。
- 检查库路径和链接器标志。
如果使用三方库,确保 CMakeLists.txt 中正确配置了库路径和链接器标志。例如:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
# 确保添加三方库的头文件
include_directories(${PATH_TO_EXTERNAL_LIBRARY}
${PATH_TO_EXTERNAL_LIBRARY}/include)
# 添加源文件
add_library(myProgram SAHRED main.cpp myLibrary.cpp)
# 链接三方库
target_link_libraries(myProgram PUBLIC /path/to/external/library)
- 启用详细编译和链接输出。
为了解详细的编译和链接过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:
set(CMAKE_VERBOSE_MAKEFILE ON)
- 检查 Ninja 输出日志。
Ninja 默认生成 .ninja_log 文件,其中包含构建过程的详细信息。您可以检查这个日志文件以了解构建过程中的问题。
cat {module}/.cxx/default/default/arm64-v8a/.ninja_log
检查编译日志中是否存在符号所在的源文件或头文件。
- 使用 nm 工具检查符号。
使用 nm 工具检查目标文件和库文件中的符号,确保符号定义存在。
可使用sdk中内置的nm工具:sdk/default/openharmony/native/llvm/bin/llvm-nm。
检查目标文件
nm myLibrary.o | grep myFunction
检查三方库文件
nm /path/to/external/library | grep myFunction
结论
通过上述步骤,您可以定位和解决 error: undefined symbol 问题。在使用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有源文件和库文件正确包含在项目中,并正确配置编译和链接选项是关键。如果问题依旧存在,详细的编译和链接输出日志通常能提供更多线索,帮助您找到具体的原因。
CPP编译报错"A ‘unknown type name’ error has occurred"
问题现象
在编译HarmonyOS C++ 项目时,报错提示"A ‘unknown type name’ error has occurred"。
解决措施
在编译HarmonyOS C++ 项目时,遇到"unknown type name"错误通常表示编译器无法识别某个类型。这可能是因为类型未定义、未包含相关的头文件,或者包含的头文件路径不正确。以下是定位和解决这个问题的步骤:
- 检查头文件包含。
确保所有必要的头文件都已正确包含在源文件中。例如,如果您正在使用某个自定义类型或库提供的类型,请确保在使用该类型的文件中包含了相关的头文件。
示例:
// main.cpp
#include "myLibrary.h"
int main() {
MyType obj;
// 使用自定义类型
return 0;
}
// myLibrary.h
#ifndef MY_LIBRARY_H
#define MY_LIBRARY_H
class MyType {
public:
MyType() {}
void doSomething();
};
#endif
- 检查头文件路径。
确保 CMakeLists.txt 中正确设置了头文件的搜索路径。可以通过 include_directories 添加头文件目录。
示例 CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
# 添加头文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)
# 添加源文件
add_library(myProgram SHARED src/main.cpp src/myLibrary.cpp)
- 清理和重新生成构建文件。
有时,构建文件可能会损坏或丢失符号定义。尝试清理构建目录并重新生成构建文件:
hvigorw clean
或手动删除模块下.cxx目录。
- 启用详细编译输出。
为了解详细的编译过程,可以启用更详细的输出。在 CMakeLists.txt 中添加以下内容:
set(CMAKE_VERBOSE_MAKEFILE ON)
- 检查编译输出日志。
Ninja 默认生成 .ninja_log 文件,其中包含构建过程的详细信息。你可以检查这个日志文件以了解构建过程中的问题。
cat .cxx/default/default/arm64-v8a/.ninja_log
- 使用 CMake 的 message 函数调试。
可以在 CMakeLists.txt 文件中添加 message 函数来打印一些调试信息,以确保路径和变量正确设置。
示例:
message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}")
message(STATUS "Include directories: ${CMAKE_INCLUDE_PATH}")
结论
通过上述步骤,您可以定位和解决 unknown type name 问题。在使用 CMake、Ninja 和 LLVM 编译 C++ 项目时,确保所有头文件正确包含并设置正确的头文件路径是关键。如果问题依旧存在,详细的编译输出日志通常能提供更多线索,帮助您找到具体的原因。
JDK版本不匹配导致编译失败
问题现象
通过命令行方式构建HarmonyOS应用或元服务过程中出现构建失败,现象如下图所示。
解决措施
该问题是由于JDK版本不匹配导致,当前配套的版本为JDK 17。因此,请根据如下方法进行修正:
- 下载并安装JDK 17版本。
- 修改JAVA_HOME环境变量,取值修改为JDK 17。
LABEL_VALUE_ERROR处理指导
问题现象
在工程同步、编译构建过程中,提示LABEL_VALUE_ERROR错误信息。
解决措施
该问题是由于config.json文件的资源引用规则变更导致,需要将“label”字段的取值,修改为资源引用方式。
-
在resources > base > element中的string.json中添加对应的字符串信息。
-
然后在config.json中重新引用该字符串资源。
应用/服务的启动界面信息缺失,提示"Schema validate failed"报错
问题现象
在工程同步或者编译构建时出现错误,提示“Schema validate failed”。
解决措施
在开发应用/服务时,可以设置应用/服务的启动界面的图标及背景颜色,创建工程后自动设置了默认的启动界面信息,但若开发者误删其中某个字段后将导致报错。下面以重新设置启动界面信息为例,开发者可自定义启动界面的图标及背景颜色。
在开发应用/服务时,为了提升应用/服务冷启动的性能,您可以通过如下方式设置应用/服务的启动界面的图标及背景颜色。
-
在模块下的resources > base > element下,点击右键选择New > Element Resource File创建资源文件。
-
在弹出的对话框中,“File name”开发者可自定义,如color;“Root element”请选择color。
创建完成后,color.json文件如下图所示:
-
将[2]创建的color.json文件拷贝至模块的ohosTest > resources > base > element目录下。
-
在模块的src > main > module.json5文件的abilities数组中,添加startWindowIcon和startWindowBackground字段(若缺少任一字段,将出现ERROR: Schema validate failed报错)。其中,startWindowIcon字段索引模块下resources > base > media中的图标资源,startWindowBackground字段索引resources > base > element > color.json中的color。
- 在src > ohosTest > module.json5文件的abilities数组中,加startWindowIcon和startWindowBackground字段。其中,startWindowIcon字段索引模块ohosTest下resources > base > media中的图标资源, startWindowBackground字段索引resources > base > element > color.json中的color。
编译报错“Schema validate failed”
问题现象
DevEco Studio编译时出现错误,提示“Schema validate failed”错误信息。
解决措施
出现该问题的原因是配置文件中字段缺失或拼写错误,可根据报错的详细信息进行问题定位。
如将module.json5文件中abilities标签中的“name”错写为“nam”,报错信息如下:
Detail: Please check the following fields.
{
instancePath: 'module.abilities[0]',
keyword: 'required',
params: { missingProperty: 'name' },
message: "must have required property 'name'",
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
{
instancePath: 'module.abilities[0]',
keyword: 'required',
params: { missingProperty: 'srcEntrance' },
message: "must have required property 'srcEntrance'",
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
{
instancePath: 'module.abilities[0]',
keyword: 'required',
params: { missingProperty: 'name' },
message: "must have required property 'name'",
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
{
instancePath: 'module.abilities[0]',
keyword: 'oneOf',
params: { passingSchemas: null },
message: 'must match exactly one schema in oneOf',
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
{
instancePath: 'module.abilities[0]',
keyword: 'enum',
params: {
allowedValues: [
'priority',
'name',
'srcEntrance',
'srcEntry',
'launchType',
'description',
'icon',
'label',
'permissions',
'metadata',
'visible',
'exported',
'skills',
'backgroundModes',
'continuable',
'startWindowIcon',
'startWindowBackground',
'removeMissionAfterTerminate',
'orientation',
'supportWindowMode',
'maxWindowRatio',
'minWindowRatio',
'maxWindowWidth',
'minWindowWidth',
'maxWindowHeight',
'minWindowHeight',
'excludeFromMissions'
]
},
message: 'must be equal to one of the allowed values',
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
{
instancePath: 'module.abilities[0]',
keyword: 'propertyNames',
params: { propertyName: 'nam' },
message: 'property name must be valid',
location: 'D:/MyApplication/entry/src/main/module.json5:15:8'
}
以上述报错为例,说明报错中关键词的含义,便于开发者理解报错信息,完成问题定位及修改。
-
instancePath:错误所在的文件位置。'module.abilities[0]'表示在module.json5文件中的第一个abilities。
-
keyword:标识当前报错字段的可选配属性,当前报错中包括’required’、‘oneOf’、‘enum’、‘propertyNames’。
-
required:表示该字段为必选配置项。由于缺失或拼写错误导致该属性未配置。
-
oneOf:表示当前配置不符合oneOf要求。通过instancePath已经确认报错出现在abilities标签,在DevEco Studio中,按住Ctrl点击"abilities"跳转到对应的module.json文件,可以查看到必须配置以下两组中的一组。根据对比排查,可识别到因拼写错误导致"name"属性未配置。
-
enum:该标签内所有可配置的属性。开发者可根据枚举值确认属性的正确写法。
-
propertyNames:如果字段拼写错误将出现propertyNames,propertyName: 'nam’指明“nam”为错误属性。
-
-
params:不同keyword对应不同的详细说明,如keyword为’required’时,params的missingProperty: ‘name’ 表示缺失的属性为“name”。
-
message:修改要求的说明,如keyword为’required’时,message表示必须配置name属性。
-
location:错误的具体位置,点击可以跳转。
编译报错“No available entry module found”
问题现象
DevEco Studio编译时出现错误,提示“No available entry module found”错误信息。
解决措施
feature模块中需要配置依赖的entry模块,DevEco Studio在编译时会校验feature模块所依赖的entry模块是否存在,出现该问题的原因可能为以下情况:
- 在feature模块的build-profile.json5文件中,entryModules字段配置的名称与实际entry模块的名称不一致。请将entryModules字段的值修改为entry模块的名称;
- 在项目级build-profile.json5文件的modules字段中,feature模块位于entry模块之前。由于DevEco Studio在进行编译时会按照从前往后的顺序进行配置,当配置feature模块时,尚未读取和配置entry模块,则会报entry模块不存在的错误。请在modules字段中将feature模块置于所依赖的entry模块之后。
编译报错“keystore password was incorrect”
问题现象
DevEco Studio编译时出现错误,提示“ERROR - hap-sign-tool: error: ACCESS_ERROR, code: 109. Details: Init keystore failed: keystore password was incorrect”错误信息。
报错原因
密钥库(p12)密码错误。
注意
密钥库密码和密钥密码是在创建p12文件时由开发者自行输入的,请牢记该密码。DevEco Studio工程的build-profile.json5文件中有记录密码的密文,但签名工具需要输入密码明文,不能直接将build-profile.json5中的值用到签名工具中。
常见场景
- 密码输入错误。
- 命令行中需要输入明文密码,误输入了密文。
- 密钥(keyAlias)密码和密钥库(p12)密码记混。
解决措施
出现该问题的原因是签名文件中签名密码错误。
开发者可通过重新自动签名解决该问题:
-
点击File > Project Structure > Project > Signing Configs,打开签名配置页面。
-
勾选“Automatically generate signing”(如果是HarmonyOS工程,需同时勾选“Support HarmonyOS”),等待重新签名,然后点击OK即可。
编译报错“please check deviceType or distroFilter of the module”
问题现象
DevEco Studio编译时出现错误,出现如下提示之一:
-
Module: (xxx) and Module: (xxx) are entry, please check deviceType or distroFilter of the module.
-
Module: (xxx) and Module: (xxx) have the same moduleName, please check deviceType or distroFilter of the module.
-
Module: (xxx) and Module: (xxx) have the same packageName, please check deviceType or distroFilter of the module.
-
Module: (xxx) and Module: (xxx) have the same ability name.
解决措施
出现该问题的原因是打包时工程未满足HAP唯一性校验逻辑,请根据[HAP唯一性校验逻辑]修改工程,满足校验逻辑即可正常打包。
编译报错“Failed to generate test project build system”
问题现象
执行多模块native模块构建时,提示“Failed to generate test project build system.”错误信息。
解决措施
请删除报错模块下的.cxx文件夹,然后选中需要构建的模块,执行Make Module ${moduleName} 完成单独构建,避免同时构建多个模块。
C/C++项目三方依赖库未打包入HAP
问题现象
C/C++项目依赖三方so时,在打包生成HAP后,发现三方so未打包到HAP中。
解决措施
当前DevEco Studio对C/C++项目三方so的寻址方式有限,如出现三方so未打包到HAP中,请尝试修改so引入方式。
-
定义一个别名(如jsbind_shared_lib_tracing),代表将要引入的三方so。
-
使用SHARED IMPORT将三方so定义为动态引入。
-
使用IMPORTED_LOCATION定义引入so的具体位置。
-
将定义的三方so声明给目标。
-
再次打包生成HAP,确认三方so是否打包到HAP中。
Static Library模块中src/main/cpp目录下的文件未打包进HAR
问题现象
点击Build > Make Module ${libraryName} 编译构建生成HAR后,发现构建产物中未出现cpp目录下的文件。
解决措施
如果使用的Hvigor为2.5.0-s及以上版本,在编译构建HAR的过程中,只会将dependencies内处于本模块路径下的本地依赖也打包进.har文件中,devDependencies里的依赖不会打包进.har文件中。
请将相应的本地依赖移至dependencies中后重新编译。
工程编译告警提示“ArkTS:WARN: For details about ArkTS syntax errors”
问题现象
工程构建时,提示“ArkTS:WARN: For details about ArkTS syntax errors, see FAQs”。
解决措施
出现该告警说明当前工程存在不符合ArkTS语法规范的写法,请根据ERROR报错中括号内的语法规则如(arkts-no-var),查看[从TypeScript到ArkTS的适配规则]中对应的说明,修改为ArkTS规范写法。
编译报错“ninja: error: mkdir(xxx): No such file or directory”
问题现象
Native工程编译报错,同时出现以下告警和报错信息。
出现工程目录长度超过250字符的告警,示例如下:
出现编译报错“ninja: error: mkdir(xxx): No such file or directory”,示例如下:
解决措施
CMAKE_OBJECT_PATH_MAX默认大小为250,如果工程中object file实际路径长度超出该大小,将导致编译报错。
开发者需要根据object file实际路径长度在工程CMakeLists.txt中设置CMAKE_OBJECT_PATH_MAX大小,具体方法如下:
-
方法一: 通常在CMAKE_OBJECT_PATH_MAX默认值基础上增加一个文件名长度即可。
示例中告警文件为TextMeasureCache.cpp.obj,长度为24字符,在默认值250的基础上增加24,即设置set(CMAKE_OBJECT_PATH_MAX 274)
-
方法二:根据object file实际路径长度计算CMAKE_OBJECT_PATH_MAX大小。
计算公式:CMAKE_OBJECT_PATH_MAX = 总路径长度 - object file中目录部分长度 + cmake哈希值字符数(固定为32)
-
总路径长度 = object file directory长度 + object file长度,object file directory、object file如下图所示,两个长度之和为297字符,以实际为准
-
object file中目录部分长度:示例中“////__/third-party/rn/ReactCommon/react/renderer/textlayoutmanager”长度为74字符,以实际为准
-
cmake哈希值字符数:cmake将长路径转换为哈希值时哈希值的长度,固定为32
代入示例中的长度后,计算可得:CMAKE_OBJECT_PATH_MAX = 297 - 74 + 32 = 255,即设置set(CMAKE_OBJECT_PATH_MAX 255)
-
编译报错“(is the command line too long?)”
问题现象
Native工程编译报错,同时出现以下告警和报错信息。
出现工程目录长度超过250字符的告警,示例如下:
出现编译报错“(is the command line too long?)”,示例如下:
解决措施
CMAKE_OBJECT_PATH_MAX默认大小为250,如果工程中object file实际路径长度超出该大小,将导致编译报错。
开发者需要根据object file实际路径长度在工程CMakeLists.txt中设置CMAKE_OBJECT_PATH_MAX大小,具体方法如下:
-
方法一: 通常在CMAKE_OBJECT_PATH_MAX默认值基础上增加一个文件名长度即可。
示例中告警文件为TextMeasureCache.cpp.obj,长度为24字符,在默认值250的基础上增加24,即设置set(CMAKE_OBJECT_PATH_MAX 274)
-
方法二:根据object file实际路径长度计算CMAKE_OBJECT_PATH_MAX大小。
计算公式:CMAKE_OBJECT_PATH_MAX = 总路径长度 - object file中目录部分长度 + cmake哈希值字符数(固定为32)
-
总路径长度 = object file directory长度 + object file长度,object file directory、object file如下图所示,两个长度之和为297字符,以实际为准
-
object file中目录部分长度:示例中“////__/third-party/rn/ReactCommon/react/renderer/textlayoutmanager”长度为74字符,以实际为准
-
cmake哈希值字符数:cmake将长路径转换为哈希值时哈希值的长度,固定为32
代入示例中的长度后,计算可得:CMAKE_OBJECT_PATH_MAX = 297 - 74 + 32 = 255,即设置set(CMAKE_OBJECT_PATH_MAX 255)
-
-
方法三:若设置CMAKE_OBJECT_PATH_MAX后,仍然报相同错误,需要修改工程存放目录,将其存放在较短的目录下。
设置CMAKE_OBJECT_PATH_MAX后,cmake会将长路径转换为32字符的哈希值以缩短路径长度,如果转换后的路径依然过长,只能缩短工程的存放路径。
编译报错“CMake Error: The following variables are used in this project, but they are set to NOTFOUND”
问题现象
Native工程中使用find_path时出现以下报错信息。
解决措施
OpenHarmony SDK提供的CMake交叉编译配置文件(ohos.toolchain.cmake)中,限制了搜索路径为CMAKE_SYSROOT。
如果开发者需要添加搜索路径,可在CMakeList.txt中使用list接口添加自定义路径,如将"D:demo"添加至搜索路径:
list(APPEND CMAKE_FIND_ROOT_PATH_MODE_INCLUDE "D:demo")
添加后,即可使用find_path查找"D:demo"目录下的文件。
编译报错 “Unknown resource name”
- 场景一
问题现象
工程中模块A引用了模块B,编译模块A时出现错误,提示 “Unknown resource name ‘xxxx’”,找不到模块B的资源。
解决措施
请确保符合以下条件:
- 资源需放置在目录resource/base路径下。
- 模块B已安装。
- 模块A中不能使用相对路径引用模块B的资源,应直接通过定义的模块名称来引用。
- 场景二
问题现象
引用模块的方式不对,如果引用的是一个其他模块的代码,也会报资源找不到。
解决措施
在oh_package.json5中引入该模块。通过定义的模块名称来引用。
如下图所示:
- 场景三
问题现象
HSP A 申请了某个权限,这个权限进行了资源的引用,在所有依赖A的组件进行构建时,报错 A 引用的资源找不到。
解决措施
手动在引用方配置对应资源可以解决此问题。
构建报错“ERROR: Task xxx was not found in the project xxx”
问题现象
命令行手动执行构建命令时,构建失败,提示“ERROR: Task xxx was not found in the project xxx.”
问题确认
- 执行hvigorw tasks命令,查看对应命令是否存在。
- 查看对应工程中module.json5文件中“type”字段是否为命令执行模块。比如图中执行assembleHar命令,是对工程中的har模块进行打包,若module.json5文件中的“type”字段不是"har"类型,则会出现上述错误提示。
解决措施
- 执行正确命令。
- 查看对应工程中module.json5文件中“type”字段类型,执行对应命令。
编译报错“The reason and usedScene attributes are mandatory for user_grant permissions”
问题现象
DevEco Studio编译失败,提示“The reason and usedScene attributes are mandatory for user_grant permissions”。
问题原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:APP包中,所有entry和feature hap的module下的requestPermissions权限清单必须指定(可以缺省为空,若非空则name必填,user_grant权限则必填reason、usedScene字段)。
解决措施
进入对应module.json5文件中,补齐requestPermissions字段下的reason和usedScene字段。如以下示例:
"requestPermissions": [
{
"name": "ohos.permission.READ_IMAGEVIDEO",
"reason": "$string:module_desc",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
]
编译报错“Only one default card can be configured in the form_config.json file”
问题现象
DevEco Studio编译失败,提示“Only one default card can be configured in the form_config.json file”。
问题原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:卡片的配置文件中isDefault不可缺省,每个UIAbility有且只有一个默认卡片。
解决措施
进入对应module.json5文件中,选择唯一默认卡片,将其他卡片的isDefault字段设置为false。
编译报错“In the form_config.json file, if the value of the updateEnabled field is true, the updateDuration and scheduleUpdateTime fields cannot be both empty”
问题现象
DevEco Studio编译失败,提示“In the form_config.json file, if the value of the updateEnabled field is true, the updateDuration and scheduleUpdateTime fields cannot be both empty.”。
问题原因
从DevEco Studio NEXT Developer Preview2版本开始新增规则:卡片的配置文件中updateEnabled不可缺省,为true时可以在定时刷新(updateDuration)和定点刷新(scheduledUpdateTime)两种方式任选其一,当两者同时配置时,定时刷新优先生效。
解决措施
进入对应module.json5文件中,按照需求,选择配置updateEnabled为false,或者增加定时刷新(updateDuration)和定点刷新(scheduledUpdateTime)两种方式配置。
编译报错“The path XX is not writable. please choose a new location”
问题现象
在mac上,通过直接打开dmg中的IDE图标打开DevEco Studio,构建报错 The path XX is not writable. please choose a new location.”。
问题原因
在mac上直接打开dmg 中IDE图标进入DevEco Studio,是会以只读的方式打开的,内置到DevEco Studio里面的文件是没有写权限的。
解决措施
将“DevEco-Studio.app”拖拽到“Applications”中,先安装在使用。
编译报错“Property ‘XX’ does not exist on type ‘typeof BuildProfile’”
问题现象
本地HSP模块对外提供的接口中使用了HAP未定义的自定义参数BuildProfileFileds,且HAP引用了HSP中的该接口,导致编译失败,提示“Property ‘XX’ does not exist on type ‘typeof BuildProfile’”。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
解决措施
可采用以下两种方式解决该问题:
- 在HAP中配置与HSP相同的自定义参数BuildProfileFileds。
- 将与HSP相同的自定义参数BuildProfileFileds配置到工程级build-profile.json5中,该方法会使HSP中的自定义参数在全局生效。
编译报错“The useNormalizedOHMUrl settings of packages xxx and the project useNormalizedOHMUrl: xxx do not match”
问题现象
编译报错“The useNormalizedOHMUrl settings of packages xxx and the project useNormalizedOHMUrl: xxx do not match”。
解决措施
[useNormalizedOHMUrl] 为true的时候ohmurl使用的是新的拼接和解析方式,不能和旧的ohmurl混用,会导致运行时无法识别。
可采用以下两种方式解决该问题:
- 将报错的依赖包的工程级build-profile.json5中的useNormalizedOHMUrl修改为与当前工程一致,重新生成依赖包并替换(useNormalizedOHMUrl缺省默认值为false)。
{
"app": {
"products": [
{
"buildOption": {
"strictMode": {
"useNormalizedOHMUrl": true
}
}
}
]
}
}
- 如果与工程不一致的依赖包较多,建议修改工程的工程级build-profile.json5中的useNormalizedOHMUrl值以及替换其它的不一致的依赖包。
如果修改了useNormalizedOHMUrl仍无法解决,表明当前hsp包是本地包,需要以本地hsp包的形式引入,请在工程下的build-profile.json5中的modules中添加报错hsp模块,示例如下:
"modules": [
{
name: "hsp", // 引用的hsp包依赖
srcPath: "../MyApplication_stageB/hsp", // 引用的hsp包的路径(绝对和相对都可以)
}
]
如何配置oh-package.json5动态依赖
oh-package.json5文件中:
- dependencies(生产依赖):声明需要在代码中import的三方库(参与编译/运行阶段使用的依赖)。
- devDependencies(开发依赖):参与项目的开发或测试阶段。
- dynamicDependencies(动态依赖):动态依赖的HSP模块。在开发者需要动态加载HSP的时候配置使用。
{
"name": "parameter-test",
"version": "@param:version",
"description": "test desc.",
"main": "index.ets",
"author": "test author",
"license": "ISC",
"dependencies": {
"libtest1": "@param:dependencies.libtest1"
},
"devDependencies": {
"libtest2": "@param:devDependencies.libtest2"
},
"dynamicDependencies": {
"libtest3": "@param:dynamicDependencies.libtest3"
},
"parameterFile": '.parameterFile/parameterFile.json5' // 开启参数化并指定参数化配置文件路径
}
如何解决SDK与镜像不匹配导致abc文件无法正常运行的问题
问题现象
当SDK版本与镜像版本不匹配时,应用将会闪退,出现jscrash,同时hilog出现日志。
解决措施
现象根本原因是SDK工具与镜像版本不匹配。推荐使用匹配的SDK与镜像版本。
查看SDK版本方法:
在DevEco Studio安装路径下的sdk路径中,执行 {sdk.dir}/openharmony/ets/build-tools/ets-loader/bin/ark/build-win/bin/es2abc.exe --bc-version可查看SDK版本号。用于检验SDK与镜像版本是否匹配。
如何解决编译报错“Could not resolve ‘xxx’ from”,但’xxx’目录存在的问题
问题现象
编译报错:“Could not resolve ‘xxx’ from”,但’xxx’目录存在,目录下存在Index文件。
问题原因
在引用目录时,编译时自动拼接小写的index文件,而目录中是大写的Index文件,在编译大小写敏感时,找不到index文件,则报错。
解决措施
在引用’xxx’目录时,明确写明引用到’xxx/Index’文件。
用户目录下没有npmrc文件
问题现象
新建项目报错 Error: The hvigor depends on the npmrc file. Configure the npmrc file first。
问题原因
在用户目录下没有 .npmrc 文件。
解决措施
在用户目录下创建.npmrc文件,配置如下信息:
registry=https://repo.huaweicloud.com/repository/npm/
@ohos:registry=https://repo.harmonyos.com/npm/
如何解决编译报错“ Error: ‘icon’ value $media:icons
invalid value.”的问题
问题现象
编译报错“ Error: ‘icon’ value $media:icons
invalid value”。
ERROR: Failed :entry:default@CompileResource...
ERROR: Tools execution failed.
Error: ref `$media:icons` don`t be defined.
Error: 'icon' value `$media:icons` invalid value.
at D:\project\process_profile\default\module.json
Detail: Please check the message from tools.
报错原因
引用的资源不存在时,编译报错指向的文件路径是build目录。
常见场景
- 资源文件未添加。
- 资源文件被意外删除。
解决方案
根据报错的资源id全局搜索,查看报错的资源是否存在。
如何解决编译报错“Error: cJSON_Parse failed, please check the JSON file.”的问题
问题现象
编译报错“Error: cJSON_Parse failed, please check the JSON file”。
图1
报错原因
module.json文件格式不正确。
常见场景
-
json文件内末尾多了逗号。
-
根标签不是大括号{}。
解决方案
检查报错指向的json文件格式,比如是否末尾多了逗号,根标签是否为大括号{}。
如何解决编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_].”的问题
问题现象
编译报错“Error: ‘XXX’ only contain [a-zA-z0-9_]”。
图2
解决方案
检查文件名是否合法,文件名只能包含大小写字母、数字、下划线。
如何解决三方包require语句报错
问题现象
当引入三方包时编译报错。
报错原因
部分三方包由npm迁移而来,其开发环境为node, 其中的require语法arkcompiler不完全支持,出现运行报错情况。
场景1:
// Module/src/test.json
{a: 1, b: 2}
//use.js
let test = require("Module/src/test.json")
需修改为:
// Module/src/test.js
module.exports = {a: 1, b: 2}
//use.js
let test = require("Module/src/test")
场景2:
// Module/package.json
...
main: "./src"
...
// use.js
let module = require("Module")
需修改为:
// Module/package.json
...
main: "./src/index.js"
...
// use.js
let module = require("Module")
场景3:
编译出现warning信息:
Plugin node-resolve: preferring built-in module 'util' over local alternative at '/Users/~/Documents/fe-module/demo/node_modules/util/util.js', pass 'preferBuiltins: false' to disable this behavior or 'preferBuiltins: true' to disable this warning
解决方案
修改rollup 配置文件,rollup.config.js中修改 preferBuiltins 字段:
plugins: [
resolve({
preferBuiltins: false, // true 或 false
mainFields: ['module', 'main'],
extensions
})
];
场景4:
import {Buffer} from 'buffer'
需修改为:
import {Buffer} from 'buffer/'
如何解决编译报错“Indexed access is not supported for fields(arkts-no-props-by-index)”的问题
问题现象
动态调用类或者接口的字段,导致编译报错出现:Indexed access is not supported for fields(arkts-no-props-by-index)。
解决方案
修改代码:
getValue(breakpoint: string): T {
return Reflect.get(this.options, breakpoint) as T;
}
如何解决编译报错“Declaration merging is not supported(arkts-no-decl-merging)” 或 “Cannot redeclare block-scoped variable ‘xxx’”的问题
问题现象
在不同的文件中声明相同变量或者interface、enum等类型,DevEco Studio不报错,但是编译报错。
解决方案
如果文件中不包含export关键字,该文件将视作全局命名空间的一部分,相当于两个文件实质为同一个文件。请添加export关键字使其成为独立命名空间,或者将声明的内容添加到自定义的命名空间中。
如何解决编译报错“ The inferred type of ‘xxx’ cannot be named without a reference to ‘xxx’. This is likely not portable. A type annotation is necessary . ”的问题
问题现象
编译报错"The inferred type of ‘xxx’ cannot be named without a reference to ‘xxx’. This is likely not portable. A type annotation is necessary"。
问题原因
HSP会生成.d.ts声明文件,由于原始文件中未注明类型,导致生成的.d.ts文件缺少类型注解。
解决方案
报错位置添加类型注解。
如何解决编译报错"arkts-no-any-unknown" 和 "Cannot find module ‘xx’ or its corresponding type declarations"的问题
问题现象
编译报错"arkts-no-any-unknown" 和 “Cannot find module ‘xx’ or its corresponding type declarations”。
问题 原因
大小写敏感导致模块找不到。常见于图片中的两种错误同时出现,且仅在Linux系统出现,win/mac不报错。
解决方案
解决引用中的大小写问题。
如何解决编译报错“ERROR: ArkTS Compiler Error ERROR: /bin/sh: “xxxx/es2abc”: Operation not permitted”的问题
问题现象
编译报错“ERROR: ArkTS Compiler Error ERROR: /bin/sh: “xxxx/es2abc”: Operation not permitted”。
问题原因
由于获取SDK的方式是从网络上下载,mac的安全设置会给可执行文件添加来源于网络的标识(com.apple.quarantine),导致无法执行。
解决方案
执行命令删除可执行文件的com.apple.quarantine标识。
xattr -d com.apple.quarantine /path/to/es2abc
如何解决编译报错“Cannot add xxxx items to index”的问题
问题现象
编译报错“Cannot add xxxx items to index”。
问题原因
被编译文件中某函数内部有大量object literal, array iteral和string,导致item的数量超过了上限(65536)。
解决方案
排查相关文件,将存在上述原因的函数进行拆分。
编译初始化报错“resource busy or locked, open ‘xxx\outputs\build-logs\build.log’”
问题现象
在升级DevEco Studio至5.0.3.403版本后,打开旧工程概率性报错:resource busy or locked, open ‘xxx\outputs\build-logs\build.log’。
问题原因
初始化时日志写入存在冲突,.hvigor目录中的build-log文件被占用导致了该报错。
解决方案
-
方法一:点击编辑器窗口上方的Sync Now。
-
方法二:点击工具栏File > Sync and Refresh Project。
-
方法三:如果方法1、2无法解决问题,可以手动删除工程目录下的.hvigor目录后重启执行Sync。
Mac环境下加载动态库,签名拦截导致未生效
问题现象
Mac环境下,在DevEco项目开发时,build-profile.json中添加了如下的插桩配置,但是插桩功能未生效。
"transformLib": "<相对模块根路径的动态库路径,以./开头>"
判断与验证
-
进入sdk中es2abc所在目录:[DevEco-Studio安装目录]/Contents/sdk/default/openharmony/ets/build-tools/ets-loader/bin/ark/build-mac/bin。
-
执行下列命令:
./es2abc --merge-abc --transform-lib <动态库路径> <测试js文件路径>
-
如果提示类似如下报错信息,原因可能是es2abc和动态库文件不属于一个签名组。
os::library_loader::Load error: dlopen(..., 0x0001):
tried: '...' (code signature in <...> '...' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.)
- 用下面命令查看es2abc和动态库文件的签名组信息,如果两个文件,一个有签名信息,一个没有签名信息,或者都有签名信息,但是签名信息中属性’TeamIdentifier’的值是不一样的,那就说明问题是签名组不一致导致的,可以使用"解决方案"提供的方式处理。
codesign -dv --verbose=1 <es2abc路径>
codesign -dv --verbose=1 <动态库路径>
解决方案
执行下列命令,将es2abc文件的签名替换成和动态库文件一样的用户签名。
codesign --remove-signature <es2abc路径>
codesign -s - -v <es2abc路径>
更多推荐
所有评论(0)