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

交叉编译C++共享库到Android aarch64出现Undefined Symbol问题

问题原因与解决方案:C++交叉编译共享库函数未定义错误

这个问题的核心原因是C++的名字修饰(Name Mangling)机制:

  • C语言编译时,函数名会原封不动保留在共享库的符号表中,App调用testFunc时能直接匹配到对应符号。
  • 而C++为了支持函数重载、命名空间等特性,会对函数名进行编码(比如把无参的testFunc()改成_Z8testFuncv这类带参数信息的名称),导致你在App里按C风格调用testFunc时,库中根本不存在这个未修饰的符号,自然报"undefined symbol"错误。

解决方案:用extern "C"强制按C语言规则处理函数

只需要给C函数的声明和定义加上extern "C"包裹,让编译器跳过C的名字修饰,按C语言的方式生成符号:

  1. 修改头文件header.hpp:
#ifndef HEADER_HPP
#define HEADER_HPP

// 用extern "C"块包裹函数声明
extern "C" {
    int testFunc();
}

#endif
  1. 修改源文件src.cpp:
#include "header.hpp"

// 函数定义也需要在extern "C"范围内(或者直接在函数前加extern "C")
extern "C" int testFunc() {
    return 456; // 示例返回值
}

验证方法

编译完成后,可以用Android NDK里的nm工具查看共享库的符号表,确认函数名是否正确:

# 假设交叉编译工具链路径已配置,或直接使用绝对路径
aarch64-linux-android-nm -D libyour_shared_lib.so | grep testFunc

如果配置正确,会输出类似0000000000001050 T testFunc的结果(T表示该符号是代码段的全局函数),和C语言版本的符号表一致。

内容的提问来源于stack exchange,提问作者Flippy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:50:20