You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:15:54