android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述

使用 pthread 获取线程名字, 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错

test_pthread.cpp:19:5: error: use of undeclared identifier 'pthread_getname_np'19 |     pthread_getname_np(thread_id, thread_name, sizeof(thread_name));|     ^
1 error generated.
ninja: build stopped: subcommand failed.

用到的构建脚本 build-android.ps1:

$NDK="d:/soft/android-ndk/r28b"
$BUILD_DIR = "build-android"cmake `-S . `-B $BUILD_DIR `-G Ninja `-DCMAKE_TOOLCHAIN_FILE="$NDK/build/cmake/android.toolchain.cmake" `-DANDROID_ABI=arm64-v8a `-DANDROID_PLATFORM=21cmake --build $BUILD_DIR

用到的关键代码: test_pthread.cpp

// 线程函数
void* hello(void* arg)
{char thread_name[16];pthread_getname_np(thread_id, thread_name, sizeof(thread_name));printf("Thread name: %s\n", thread_name);return NULL;
}

3. 分析和解决

3.1 pthread_getname_np 的 np 是什么意思?

是 non portable (不可移植) 的意思.

https://man7.org/linux/man-pages/man3/pthread_getname_np.3.html (参考链接[1])

hence the suffix “_np” (nonportable) in the names.

3.2 torchat issue 2

https://github.com/FraMecca/torchat/issues/2 (参考链接[2])

提问者贴出的编译 log,看起来是 linux-x64 native 编译。

仓库 owner 回复说, 需要定义 _GNU_SOURCE 宏。

The issue is probably related to a missing #define _GNU_SOURCE .

尝试在 test_pthread.cpp 开头添加, 报错不变。

3.3 pocoproject issue 4042

https://github.com/pocoproject/poco/issues/4042 (参考链接[5]) 报告了相同的错误, 是在 android armv7-a.

project member 和 contributor 的回答没什么用处。 用户已经包含了 pthread.h 头文件。

3.4 从 bionic 找到答案

pthread 是在 Android bionic 库里定义实现的。

git clone https://android.googlesource.com/platform/bionic  # 参考链接[3]

pthread_getname_np 为关键字在 *.md 文件里搜索, docs\status.md 有说明:

https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md#libc (参考链接[4]) 是它在线版:

在这里插入图片描述

New libc functions in O (API level 26):...* `pthread_getname_np`

意思是: pthread_getname_np() 是 API level 26 开始支持的.

因此解决方案是:修改 -DANDROID_PLATFORM=21-DANDROID_PLATFORM=26 或更高版本:

build-android.ps1:

$NDK="d:/soft/android-ndk/r28b"
$BUILD_DIR = "build-android"cmake `-S . `-B $BUILD_DIR `-G Ninja `-DCMAKE_TOOLCHAIN_FILE="$NDK/build/cmake/android.toolchain.cmake" `-DANDROID_ABI=arm64-v8a `-DANDROID_PLATFORM=26cmake --build $BUILD_DIR

4. 总结

pthread_getname_np() 是在 Android API 26 新增的函数, 在 cmake configure 阶段需要传入 -DANDROID_PLATFORM=26 或更高版本。 这在 Android C 标准库 bionic 的文档里有提及: https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md 。

References

  • [1] https://man7.org/linux/man-pages/man3/pthread_getname_np.3.html
  • [2] https://github.com/FraMecca/torchat/issues/2 (方案无效)
  • [3] https://android.googlesource.com/platform/bionic.git/
  • [4] https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md#libc
  • [5] https://github.com/pocoproject/poco/issues/4042

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端基础】6、CSS的文本属性(text相关)

目录内容 text-decoration:设置文本装饰线text-transform:文本中文字的大小写转换text-indent:首行缩进text-align:设置文本对齐方式 一、text-decoration:设置文本装饰线 常见值: None:没有…

【Ansible】模块详解

一、ansible概述 1.1 ansible介绍 Ansible 是一个基于 Python 开发的配置管理和应用部署工具,近年来在自动化管理领域表现突出。它集成了许多传统运维工具的优点,几乎可以实现 Pubbet 和 Saltstack 所具备的功能。 1.2 ansible能做什么 批量处理。An…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

一、工具简介 git commit --amend是Git版本控制系统的核心补救命令,主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录,而是通过覆盖原提交实现版本历史的整洁性,特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…

软考 系统架构设计师系列知识点之杂项集萃(56)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(55) 第91题 商业智能关注如何从业务数据中提取有用的信息,然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立()、数据分…

Spark任务调度流程详解

1. 核心调度组件 DAGScheduler:负责将Job拆分为Stage,处理Stage间的依赖关系。 TaskScheduler:将Task分配到Executor,监控任务执行。 SchedulerBackend:与集群管理器(如YARN、K8s)通信&#x…

第04章—技术突击篇:如何根据求职意向进行快速提升与复盘

经过上一讲的内容阐述后,咱们定好了一个与自身最匹配的期望薪资,接着又该如何准备呢? 很多人在准备时,通常会选择背面试八股文,这种做法效率的确很高,毕竟能在“八股文”上出现的题,也绝对是面…

Go语言的逃逸分析是怎么进行的

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

ARM 芯片上移植 Ubuntu 操作系统详细步骤

一、准备工作 (一)硬件准备 ARM 开发板:确保 ARM 开发板的型号与 Ubuntu 官方支持的 ARM 架构兼容,常见的 ARM 架构有 ARMv7、ARMv8 等。例如树莓派系列开发板,广泛用于 ARM 系统移植,其采用 ARM 架构。存…

两台服务器之前共享文件夹

本文环境 服务器A:ubuntu24.22系统 IP:10.0.8.1 服务器B:ubuntu24.22系统 IP:10.0.8.10 本操作旨在将服务器B的/opt/files目录共享给服务器A得/opt/files 在 B 服务器上设置共享 安装 NFS 服务: sudo apt -y install nfs-kernel-server编辑/etc/exports文件&…

超市销售管理系统 - 需求分析阶段报告

1. 系统概述 超市销售管理系统是为中小型超市设计的信息化管理解决方案,旨在通过信息化手段实现商品管理、销售处理、库存管理、会员管理等核心业务流程的数字化,提高超市运营效率和服务质量,同时为管理者提供决策支持数据。 2. 业务需求分…

GPIO控制

GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚, 这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定, 如作为串口、I2…

Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库

介绍 Nexus 是广泛使用的仓库管理工具,常用于管理 Java 构件(如 JAR、WAR、EAR 文件)。它可以作为一个本地的 Maven 仓库,用来存储和管理项目的依赖包和构建产物。支持多种仓库类型,能够帮助开发团队更高效地管理构件…

Android 13 默认打开 使用屏幕键盘

原生设置里,系统-语言和输入法-实体键盘-使用屏幕键盘 选项, 关闭时,外接物理键盘,如USB键盘,输入时不会弹出软键盘。 打开时,外接物理键盘,如USB键盘,输入时会弹出软键盘。 这个选…

关于ubuntu下交叉编译arrch64下的gtsam报错问题,boost中boost_regex.so中连接libicui18n.so.55报错的问题

交叉编译gtsam时遇到的报错信息如下:gtsam需要连接boost, 解决办法: 1.重新编译boost可解决。 2.自己搞定生成一个libicui18n.so.55。 由于我们的boost是公用的,因此1不太可能(我试过重新编译完boost,在编译gtsam完…

android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析

1. 概要 基础库 libbase.a 基于 android ndk r18b 编译, 被算法库 libfoo.so 和算法库 libbar.a 依赖, 算法库则分别被 libapp1.so 和 libapp2.so 依赖。 libapp1.so 的开发者向 libfoo.so 的开发者反馈了链接报错: error: undefined symb…

如何清除windows 远程桌面连接的IP记录

问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…

使用 React Native实现鸿蒙开发的详细方案

一、环境准备 1. 基础环境要求 操作系统:Windows 10/11 或 macOS (建议版本最新)Node.js: v16.x 或更高版本npm: v8.x 或更高版本Java JDK: 11 或更高版本DevEco Studio: 3.1 或更高版本 (鸿蒙官方IDE)2. 安装 DevEco Studio 从华为开发者官网下载安装时选择以下组件: Harmo…

贪心算法应用:顶点覆盖问题详解

贪心算法应用:顶点覆盖问题详解 贪心算法是解决顶点覆盖问题的经典方法之一。下面我将从基础概念到高级优化,全面详细地讲解顶点覆盖问题及其贪心算法解决方案。 一、顶点覆盖问题基础 1. 问题定义 顶点覆盖问题(Vertex Cover Problem&am…

Excel安全防护:开源批量加密工具推荐与使用指南

先放下载链接:https://tool.nineya.com/s/1iqsn2sh0 在日常办公里,像财务数据、客户信息、项目报表这类核心资料,常常是以 Excel 文件的形式来存储的。要是手动一个一个地给这些文件加密,那可太费时间和精力了,而且还…

【C++】学习、项目时Debug总结

这里写目录标题 1. 内存问题1.1. 内存泄漏1.1.1. 内存泄漏案例检查方法1.1.2. 主线程提前退出导致【控】1.1.3. PostThreadMessage失败导致的内存泄漏**【控】**1.1.4. SendMessage 时关闭客户端【控】1.1.5. 线程机制导致【**控】**1.1.6. exit(0)导致【…