Android项目CMake导入依赖SO库报错,求正确配置方法
问题:Android项目导入预编译SO库的CMake链接错误
环境与需求
需要导入三个预编译SO库:A.so(依赖B.so和C.so)、B.so、C.so,同时有A.h头文件。当前Gradle配置已指定ABI为arm64-v8a,CMake版本3.18.1。
错误分析
编译时出现Shell语法错误,链接命令中出现非法的-l( -larm64-v8a -l)参数,核心问题:
- CMake指令拼写错误:
cmake_minimum_required(VERSIO 3.4.1)中VERSIO应为VERSION,错误指令导致CMake解析异常,生成非法链接参数。 - 不必要的头文件添加:
add_library中把A.h作为源文件传入,头文件无需加入编译目标,只需通过路径引入即可。 - 未明确库间依赖:
A.so依赖B.so和C.so,但当前配置未声明这层依赖,可能引发链接顺序问题。
修复步骤
- 修正CMake版本指令拼写:将
VERSIO改为VERSION。 - 移除
add_library中的头文件:仅保留源文件my_native.cpp。 - 声明库间依赖关系:给
libA添加对libB和libC的依赖,链接my_native时只需关联libA,CMake会自动处理传递依赖。 - 确认头文件路径:确保
INCLUDE_DIRECTORIES指向A.h所在目录。
修复后的完整CMake配置
cmake_minimum_required(VERSION 3.4.1) project(MyProjectNative) # 构建自定义Native库,仅传入源文件 add_library( my_native SHARED my_native.cpp) # 引入头文件路径,确保A.h可被正确引用 # 如果A.h在include子目录,替换为 ${CMAKE_CURRENT_SOURCE_DIR}/include INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) # 查找NDK内置的log库 find_library( log-lib log) # 导入预编译A.so add_library(libA SHARED IMPORTED) set_target_properties(libA PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${ANDROID_ABI}/A.so) # 导入预编译B.so add_library(libB SHARED IMPORTED) set_target_properties(libB PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${ANDROID_ABI}/B.so) # 导入预编译C.so add_library(libC SHARED IMPORTED) set_target_properties(libC PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${ANDROID_ABI}/C.so) # 声明A对B、C的依赖,INTERFACE表示依赖会传递给链接libA的目标 target_link_libraries(libA INTERFACE libB libC) # 链接自定义库到libA和log库 target_link_libraries( my_native libA ${log-lib})
验证要点
- 确认
libs/${ANDROID_ABI}目录下存在对应ABI的A.so、B.so、C.so文件。 - 若
A.h不在CMakeLists.txt所在目录,调整INCLUDE_DIRECTORIES路径至正确位置。
内容的提问来源于stack exchange,提问作者Maxwell
相关产品推荐
相关产品推荐

