当前位置: 首页 > article >正文

从Android.mk到CMake:处理‘undefined symbol’的现代最佳实践与存根库技巧

从Android.mk到CMake处理‘undefined symbol’的现代最佳实践与存根库技巧在Android原生开发领域构建系统的演进从未停歇。当开发者将项目从传统的Android.mk迁移到现代CMake构建系统时那些曾经熟悉的链接错误——特别是undefined symbol类问题——往往会以全新的面貌出现。本文将以典型的android::RefBase::decStrong符号缺失问题为切入点深入探讨两种构建系统下的解决方案差异并重点分享CMake环境下处理非NDK稳定API依赖的进阶技巧。1. 构建系统演进与符号解析机制变迁Android NDK的构建工具链在过去五年经历了显著变革。从基于Makefile的Android.mk到如今主流的CMake不仅仅是语法格式的变化更代表着构建理念的升级。理解这种差异对解决链接问题至关重要。在Android.mk体系中开发者通过LOCAL_LDFLAGS和LOCAL_SHARED_LIBRARIES等变量控制链接行为。例如处理undefined symbol问题时传统做法可能是LOCAL_SHARED_LIBRARIES : libutils LOCAL_LDFLAGS : -Wl,--unresolved-symbolsignore-all而CMake采用完全不同的范式其核心是**目标target**概念。每个库或可执行文件都是一个独立目标依赖关系通过target_link_libraries显式声明。这种设计带来了更好的工程化管理和更精确的符号解析。注意直接移植-Wl,--unresolved-symbolsignore-all这类链接器选项到CMake环境可能产生难以预料的行为差异特别是在Android平台特有的动态链接机制下。2. CMake环境下的符号缺失解决方案当遇到undefined symbol: android::RefBase::decStrong这类错误时现代CMake项目应遵循以下解决路径2.1 正确声明NDK依赖首先确认目标符号是否属于NDK稳定API。可通过官方文档或ndk-depends工具验证。若属于稳定API只需在CMakeLists.txt中正确声明find_library(log-lib log) target_link_libraries(your_target PRIVATE ${log-lib})对于非稳定API的情况如libutils中的符号则需要更精细的处理策略。以下是关键步骤对比处理方式Android.mk实现CMake等效方案直接链接LOCAL_SHARED_LIBRARIEStarget_link_libraries头文件包含LOCAL_C_INCLUDEStarget_include_directories链接器选项LOCAL_LDFLAGStarget_link_options2.2 创建接口库处理内部依赖对于Android系统内部库的依赖CMake的**接口库INTERFACE library**特性提供了优雅的解决方案。以下是一个处理libutils依赖的示例add_library(utils_stub INTERFACE) target_include_directories(utils_stub INTERFACE ${ANDROID_NDK}/sources/cxx-stl/system/include system/core/libutils/include) target_link_options(utils_stub INTERFACE -Wl,--unresolved-symbolsignore-in-object-files)这种做法的优势在于保持项目配置的模块化避免污染全局编译标志精确控制符号解析行为3. 高级存根库技术实战当必须使用非公开系统API时存根库Stub Library成为可靠选择。现代CMake提供了比传统方式更灵活的存根实现方案。3.1 最小化存根实现创建stub_utils.cpp文件// 最小化实现关键符号 extern C void _ZN7android7RefBase9decStrongEPKv() { // 空实现满足链接要求 }对应的CMake配置add_library(utils_stub SHARED stub_utils.cpp) set_target_properties(utils_stub PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/stubs) target_link_libraries(your_target PRIVATE utils_stub)3.2 自动化存根生成对于大型项目可结合Python脚本自动生成存根# generate_stubs.py import re def generate_stub(symbol): return fextern C void {symbol}() {{}} # 从nm输出提取缺失符号 missing_symbols [...] with open(stubs.cpp, w) as f: for sym in missing_symbols: f.write(generate_stub(sym) \n)在CMake中集成该脚本add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stubs.cpp COMMAND python3 ${CMAKE_SOURCE_DIR}/scripts/generate_stubs.py DEPENDS ${MISSING_SYMBOLS_FILE} )4. 构建系统混合场景下的兼容方案在迁移过渡期或遗留项目维护中常会遇到两种构建系统共存的场景。此时需要特别注意符号可见性控制# 在CMake中限制符号暴露 set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)ABI兼容性检查# 使用ndk-build和cmake分别编译后比较符号表 $OBJDUMP -T libold.so old_symbols.txt $OBJDUMP -T libnew.so new_symbols.txt diff old_symbols.txt new_symbols.txt渐进式迁移策略先迁移基础库模块保持Android.mk和CMakeLists.txt并行构建使用CMAKE_ANDROID_NDK变量确保工具链一致在处理undefined symbol问题时现代CMake提供了更强大的调试工具。例如使用--trace-expand选项追踪符号解析过程cmake --build . --target your_target -- -v -Wl,--trace-symbolandroid::RefBase::decStrong这种细粒度的调试能力配合Android Studio的Native代码诊断工具可以大幅提升复杂链接问题的排查效率。

相关文章:

从Android.mk到CMake:处理‘undefined symbol’的现代最佳实践与存根库技巧

从Android.mk到CMake:处理‘undefined symbol’的现代最佳实践与存根库技巧 在Android原生开发领域,构建系统的演进从未停歇。当开发者将项目从传统的Android.mk迁移到现代CMake构建系统时,那些曾经熟悉的链接错误——特别是undefined symbol…...

从零构建板球控制系统:PID算法与视觉定位实战

1. 板球控制系统入门指南 第一次听说板球控制系统时,你可能和我当初一样充满好奇:这个小玩意儿到底是怎么工作的?简单来说,它就是一个能自动控制小球在平板上运动的智能系统。想象一下,你把一个白色小球放在黑色平板上…...

基于明朝内阁制的AI多智能体协作系统:从原理到部署实战

1. 项目概述:当皇上,一个基于明朝内阁制的AI多智能体协作系统 如果你曾经幻想过像皇帝一样,只需动动嘴皮子,就有一群“大臣”为你分忧解难,处理从写代码到查账单的各种琐事,那么“当皇上”这个项目&#x…...

一键捕获完整网页:3步掌握Chrome长页面截图神器

一键捕获完整网页:3步掌握Chrome长页面截图神器 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …...

3分钟快速上手:AcFunDown视频下载工具完整指南

3分钟快速上手:AcFunDown视频下载工具完整指南 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown AcFunDown是一款专为A站…...

LibreDWG:解放AutoCAD文件的瑞士军刀,3个实用场景教你玩转开源CAD处理

LibreDWG:解放AutoCAD文件的瑞士军刀,3个实用场景教你玩转开源CAD处理 【免费下载链接】libredwg Official mirror of libredwg. With CI hooks and nightly releases. PRs ok 项目地址: https://gitcode.com/gh_mirrors/li/libredwg 还在为无法打…...

3步拯救你的机械键盘:KeyboardChatterBlocker防连击终极指南

3步拯救你的机械键盘:KeyboardChatterBlocker防连击终极指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否遇到过这…...

如何构建企业级开源实时协作编辑器?Etherpad团队协作解决方案终极指南

如何构建企业级开源实时协作编辑器?Etherpad团队协作解决方案终极指南 【免费下载链接】etherpad Etherpad: A modern really-real-time collaborative document editor. 项目地址: https://gitcode.com/gh_mirrors/et/etherpad 在数字化转型浪潮中&#xff…...

手把手教你用checksts.py脚本,提前给VMware vCenter的STS证书做‘体检’(避坑指南)

企业级vCenter运维:STS证书主动检测与全生命周期管理实践 当vCenter突然弹出503 Service Unavailable错误时,多数运维团队的第一反应是检查服务状态和网络连接,却很少有人会想到——这可能是由那个"沉默的定时炸弹"STS证书过期引发…...

AI编程助手变身色彩专家:meodai/skill.color-expert技能库深度解析

1. 项目概述:一个为AI编程助手打造的“色彩科学专家”技能库如果你和我一样,经常在开发与色彩相关的工具、设计系统,或者向团队解释复杂的色彩理论时,需要反复查阅资料,那你一定会理解那种“知识碎片化”的痛苦。你可能…...

Cesium项目避坑指南:动态泛光效果的性能优化与纹理材质选择

Cesium项目避坑指南:动态泛光效果的性能优化与纹理材质选择 当你在Cesium中实现了一个基础泛光效果后,可能会发现随着场景复杂度的提升——比如加载整个城市建筑群或复杂的管线网络时——性能开始急剧下降。帧率骤降、内存占用飙升,甚至浏览器…...

SITS大会技术社区交流活动实战指南(附2024最新人脉激活话术库)

更多请点击: https://intelliparadigm.com 第一章:SITS大会技术社区交流活动 SITS(Software Innovation & Technology Summit)大会作为国内聚焦开源协作与工程实践的年度技术盛会,其技术社区交流活动以“共建、共…...

Astro群岛架构与内容集合:构建高性能AI工具配置中心实践

1. 项目概述:一个面向开发者的AI工具配置中心如果你和我一样,每天都在和Cursor、Claude、VS Code这些工具打交道,那你肯定也遇到过类似的烦恼:看到一个同事分享了一个巨好用的Cursor规则文件,或者一个能直接调用内部AP…...

别再只盯着TOF了!从三角测距到相控阵,一文搞懂激光雷达的四种测距原理与选型避坑

激光雷达技术全景解析:从基础原理到工程选型实战指南 当扫地机器人精准绕开你的拖鞋,当自动驾驶汽车在暴雨中识别障碍物,背后都离不开一项关键技术——激光雷达。作为机器感知环境的"眼睛",激光雷达的性能直接决定了整个…...

别再只装Multisim了!完整配置NI Circuit Design Suite 14.0,解锁Ultiboard和全版本功能

解锁NI Circuit Design Suite 14.0全功能:从Multisim到Ultiboard的完整配置指南 在电子设计自动化(EDA)领域,NI Circuit Design Suite一直以其强大的功能和易用性受到工程师的青睐。然而,许多用户仅仅停留在Multisim的…...

从零到一:TMS320F28335开发环境避坑与首个工程实战

1. 开发板选购与开箱准备 第一次接触TMS320F28335时,我和大多数初学者一样面临"从哪开始"的困惑。经过对比多家产品,最终选择了普中科技的开发套件。这个选择主要基于三个实际考量:首先是性价比,199元的价格包含了XDS10…...

终极指南:3分钟掌握BOTW存档编辑器,打造你的专属海拉鲁冒险

终极指南:3分钟掌握BOTW存档编辑器,打造你的专属海拉鲁冒险 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否厌倦了在《塞尔达传说&am…...

蓝奏云直链解析终极指南:三步获取高速下载链接

蓝奏云直链解析终极指南:三步获取高速下载链接 【免费下载链接】LanzouAPI 蓝奏云直链,蓝奏api,蓝奏解析,蓝奏云解析API,蓝奏云带密码解析 项目地址: https://gitcode.com/gh_mirrors/la/LanzouAPI 还在为蓝奏云…...

AIAgent权限审计报告生成器已上线(SITS2026 v1.2认证工具):10分钟自动生成符合监管要求的Traceable权限图谱

更多请点击: https://intelliparadigm.com 第一章:AIAgent权限管理:SITS2026概述 SITS2026 是新一代面向多智能体协同环境的细粒度权限管控规范,专为 AIAgent 系统设计,强调身份可信、意图可验、操作可溯。它不再依赖…...

新型AirSnitch攻击可绕过家庭、办公室及企业Wi

很难夸大Wi-Fi在生活各个层面所扮演的角色。负责管理这一无线协议的组织表示,自上世纪90年代末Wi-Fi问世以来,已有超过480亿台支持Wi-Fi的设备出货。有估计显示,全球Wi-Fi用户数量约达60亿,占世界总人口的70%左右。尽管人们对Wi-F…...

ARM CoreSight通道接口原理与应用实战

1. ARM CoreSight通道接口概述在复杂的多核SoC调试系统中,CoreSight的通道接口(Channel Interface)扮演着神经中枢的角色。这种特殊的通信机制最早出现在ARMv7架构时代,经过多次迭代已成为现代调试体系的核心组件。我曾在多个车载…...

8大网盘直链下载助手:开源工具如何彻底改变你的文件下载体验?

8大网盘直链下载助手:开源工具如何彻底改变你的文件下载体验? 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…...

AI SaaS快速开发:从架构设计到生产部署的实战指南

1. 项目概述:一个面向AI SaaS的快速开发起点最近在GitHub上看到一个挺有意思的项目,叫sony9997/ai-saas。光看这个名字,就能大概猜到它的定位:一个为构建AI驱动的SaaS(软件即服务)应用而设计的项目模板或脚…...

ETS2LA:在《欧洲卡车模拟2》中实现自动驾驶的终极解决方案

ETS2LA:在《欧洲卡车模拟2》中实现自动驾驶的终极解决方案 【免费下载链接】Euro-Truck-Simulator-2-Lane-Assist Plugin based interface program for ETS2/ATS. 项目地址: https://gitcode.com/gh_mirrors/eur/Euro-Truck-Simulator-2-Lane-Assist 你是否曾…...

SKILL.md:用Markdown文件让AI助手直接调用Twitter API

1. 项目概述:让AI助手直接操作Twitter/X的“技能文件” 如果你正在捣鼓AI助手,想让它帮你自动刷推、搜索信息、管理社群,甚至自动回复私信,那么你很可能已经遇到了一个巨大的障碍:Twitter(现在叫X&#xf…...

网盘直链下载助手:告别限速,9大平台文件高速下载终极方案

网盘直链下载助手:告别限速,9大平台文件高速下载终极方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移…...

提升英文打字速度的终极方案:Qwerty Learner 免费安装与使用指南

提升英文打字速度的终极方案:Qwerty Learner 免费安装与使用指南 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: h…...

开发AI应用时如何借助Taotoken实现模型故障的自动容灾

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时如何借助Taotoken实现模型故障的自动容灾 在构建依赖大模型能力的AI应用时,服务连续性是一个关键考量。单…...

基于容器化技术的高交互蜜罐系统设计与实战部署

1. 项目概述:一个高交互的蜜罐系统最近在整理安全研究工具链时,又翻出了beelzebub这个项目。它不是一个新面孔,但在开源蜜罐领域,其设计理念和实现方式一直让我觉得很有意思。简单来说,beelzebub是一个用 Go 语言编写的…...

ABAQUS 2023版实战:修正DPC帽盖模型参数设置保姆级教程(附岩土工程案例)

ABAQUS 2023版修正DPC帽盖模型参数设置全解析:从理论到岩土工程实战 岩土工程和粉末材料模拟中,材料本构模型的选择直接影响计算结果的可靠性。修正Drucker-Prager帽盖模型(Modified Drucker-Prager Cap,简称修正DPC模型&#xff…...