Android NDK CMake链接失败:undefined reference错误求助
Android NDK CMake链接库失败问题解决
核心问题排查与修复
你的undefined reference和链接失败错误,主要源于静态库导入配置错误、依赖链接缺失,以下是具体修复步骤:
1. 修正静态库的导入类型
你将libA声明为SHARED IMPORTED,但实际使用的是.a后缀的静态库,CMake类型识别错误会直接导致链接失败,修改如下:
add_library( libA STATIC # 从SHARED改为STATIC,匹配.a静态库类型 IMPORTED )
2. 补全custom-native库的依赖链接
如果app.cpp中调用了abc或libA的函数,必须将abc链接到custom-native,否则会出现未定义引用错误:
target_link_libraries(custom-native abc ${log-lib})
3. 验证库文件路径有效性
确认${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libA.a路径正确:
- 若
CMakeLists.txt在src/main/cpp目录,../jniLibs对应src/main/jniLibs,检查该目录下是否存在armeabi-v7a、x86子目录,且每个子目录下都有libA.a文件。
4. 确认头文件包含完整性
在abc.c开头必须包含libA的头文件,比如:
#include "libA.h" // 替换为实际头文件名
如果头文件不在默认搜索路径,需添加头文件目录:
target_include_directories(abc PRIVATE ${CMAKE_SOURCE_DIR}/../jniLibs/include) // 替换为实际头文件路径
完整修正后的CMake代码
cmake_minimum_required(VERSION 3.18.1) project("app") add_library( abc SHARED ${CMAKE_SOURCE_DIR}/src/abc.c) # 修正静态库导入类型 add_library( libA STATIC IMPORTED ) add_library( custom-native SHARED ${CMAKE_SOURCE_DIR}/src/app.cpp) set_target_properties(libA PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libA.a) # 可选:添加头文件搜索路径(按需启用) # target_include_directories(abc PRIVATE ${CMAKE_SOURCE_DIR}/../jniLibs/include) find_library( log-lib log) target_link_libraries(abc PUBLIC libA) # 补全custom-native的依赖链接 target_link_libraries(custom-native abc ${log-lib})
额外检查项
- 确认
libA.a是针对armeabi-v7a、x86架构编译的,架构不匹配也会引发链接错误。 - 执行
Build > Clean Project后再Rebuild Project,清理缓存避免旧配置干扰。
内容的提问来源于stack exchange,提问作者Naufal Prakoso
相关产品推荐
相关产品推荐

