HarmonyOS鸿蒙Next中子目录native模块怎么链接系统库?
HarmonyOS鸿蒙Next中子目录native模块怎么链接系统库?
根目录模块在链接例如libvulkan.zo库时,在键入库内对象时可以正常联想并补全,当移动模块至非根目录(例如features/)下时,应该如何设置并正常联想补全呢?
是否需要将外部库中对应的so库移动到模块的lib目录下?
假设你这个A模块从项目根目录移动到个子目录,然后在A模块里编辑键入代码系统库的对象时,代码补全的功能失效了,对吧。
代码补全失效主要原因是,DevEco 的索引失效了或者配置未能正确同步。
首先通过清理工程和清缓存,重新索引试试。

如果问题还在,先验证下,在移动后子目录随便找个或建个ets 引用个ArkTS库测试下补全,这步确保补全功能好使。
功能好使,就再检查各个目录的oh-package.json5 和 CMakeLists.txt,确保他们的配置和配置路径正确。如有修改再同步一下工程或清缓存重新索引。
如问题仍有,可以把你的工程框架和问题点截图发下,看看。
更多关于HarmonyOS鸿蒙Next中子目录native模块怎么链接系统库?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
嗯嗯,谢谢大佬指教🥰
请问下cmakelists中使用find_library检索库时,会自动包含sdk中包含的库目录嘛。
这个无法补全的问题是在win deveco中出现的,在鸿蒙版和mac版上没出现(clone下来建立索引后即可补全)🥲,而在win上重新索引后也还是无法补全,
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,
不过虽然不能补全,但是如果完整输入名称,还是能识别出对应的内容(可以ctrl+左键跳转到正确位置),
find_library会检索配置的库,SDK的库加载是IDE负责的。编译链的知识可就海了,可以慢慢学习,针对C/C++编译原理花两周认真研究,也能通透的,再去解决问题就知道哪里下手了。
那这个就是个例了,win 中IDE会卡吗?卡的话,可能是就电脑配置撑不起IDE了,用的时候可以看看电脑进程。
有用给个采纳:)
嗯嗯,感谢🙏一会儿我去尝试下这些方法☺,
系统库不需要拷到模块的 libs 目录,关键是子目录 native 模块的 CMakeLists.txt 路径基准变了。建议用 CMAKE_CURRENT_SOURCE_DIR 固定当前模块根路径,再配置 include 路径和 target_link_libraries。系统库按 SDK 实际库名直接链接,例如 libace_napi.z.so、libhilog_ndk.z.so;三方 so 才放到 libs/<abi> 并用相对当前 CMakeLists.txt 的路径引用。移动到 features/ 后重点检查 CMake 是否被构建配置引用、include 路径是否指向新模块、库名是否写对。
是不是find_library会包含对sdk目录的库搜索啊,
不要把 libvulkan.so 复制到你的 jniLibs /lib 目录,复制会导致:冲突、上架被拒、版本不兼容、崩溃等问题。
系统库是手机系统自带的,你只需要在 CMakeLists.txt 里正确配置路径即可
cmake_minimum_required(VERSION 3.10)
include_directories(${OHOS_SDK_ROOT}/sysroot/usr/include)
link_directories(${OHOS_SDK_ROOT}/sysroot/usr/lib/${OHOS_ARCH})
# 你的库
add_library(my_native_lib SHARED my.cpp)
# 查找系统库
find_library(log-lib log)
find_library(vulkan-lib vulkan)
# 链接
target_link_libraries(
my_native_lib
${log-lib}
${vulkan-lib}
)
你好,请问这里的ohos_sdk_root是包含了 openharmony 和 hms 两个库目录的嘛,是否需要单独添加一遍 openharmony的库路径?
在deveco的外部库中看,像是vulkan.so是在前者的lib目录下的。
我尝试了向cmake中添加库和头文件路径,但是仍然无法自动联想补全🥲,
但是完整输入后,是能正确c+左键指向到对应头文件位置的,是否是需要添加什么额外设置?🥹,
系统库无需移动so到模块目录。
非根目录下无法联想补全,通常是因为IDE没有正确解析到C API的声明头文件。你需要做的是在子模块的构建配置中,明确添加系统库的头文件路径。
如果使用oh-package.json5管理的C API:
确保子模块的oh-package.json5中native字段正确配置了依赖的外部C API,IDE会自动解析其头文件。写法如下:
{
"name": "子模块名",
"dependencies": {
"@ohos/vulkan": "file:../../libs/vulkan"
}
}
如果直接使用CMakeLists.txt:
在子模块的CMakeLists.txt中使用target_include_directories,显式添加对应系统库SDK的头文件路径。以libvulkan为例:
target_include_directories(你的库名 PUBLIC
${OHOS_SDK}/native/sysroot/usr/include
${OHOS_SDK}/native/sysroot/usr/include/vulkan
)
其中${OHOS_SDK}是DevEco Studio内置的宏,指向当前HarmonyOS SDK路径。
这样配置后,IDE的索引服务就能找到声明,恢复代码补全。


