交叉编译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语言的方式生成符号:
- 修改头文件
header.hpp:
#ifndef HEADER_HPP #define HEADER_HPP // 用extern "C"块包裹函数声明 extern "C" { int testFunc(); } #endif
- 修改源文件
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
相关产品推荐
相关产品推荐

