undefined reference to `__android_log_print‘

news2024/11/16 9:43:11

报错描述

在 Android NDK 相关的工程构建中,出现报错:

undefined reference to `__android_log_print’

翻译成 QM 能理解的话: 在链接阶段, 遇到一个需要被链接的符号 __android_log_print, 但是没有在给出的依赖库里面找到 __android_log_print 符号。

在这里插入图片描述

[2/2] Linking CXX executable testbed
FAILED: testbed
cmd.exe /C "cd . && D:\soft\android-ndk\r26-beta1\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android24 --sysroot=D:/soft/android-ndk/r26-beta1/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security   -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments CMakeFiles/testbed.dir/main.cpp.o -o testbed  -latomic -lm && cd ."
ld.lld: error: undefined symbol: __android_log_print
>>> referenced by main.cpp:10 (D:/github/min-repros/test_android_log/r21e/main.cpp:10)
>>>               CMakeFiles/testbed.dir/main.cpp.o:(main)
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

为什么要链接 __android_log_print

QM 的初始诉求是, 不准开发的代码依赖 log 库。那么谁用了 __android_log_print 符号, 目的又是什么?

__android_log_print 符号, 对应到 C/C++ 函数, 用于打印日志并显示到 Android LogCat。啥意思? 我们开发者提供的 .a/.so 库,最终是放到 Android App 里使用的,而 Android App 是一个 GUI 界面程序, 它是没有控制台的 log 输出给用户看的。 也就是说,如果用户的一些交互操作, 导致 Android App 崩溃了, 并且打算从 Android Studio 的 LogCat 去检查报错问题(此时很可能是 Android Java/Kotlin开发者),那么 LogCat 的报错信息是非常有用出的: 快速定位问题。

当然, 你也可以让 Android NDK 开发者完全不使用 __android_log_print. 那意味着: 如果 Android App 出现 Crash,Android App 的 Java/Kotlin 开发者无从查起, Android NDK 开发者也拿不到 log 内容, 无法定位 bug。

复现代码

#include <string.h>
#include <jni.h>
#include <android/log.h>

#define  LOG_TAG    "foo"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

int main()
{
    LOGI("test");
}

链接 log 库

add_executable(testbed main.cpp)
target_link_libraries(testbed PRIVATE log) # 增加这一行

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

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

相关文章

关于会议OA需求分析与开发功能设计

前言&#xff1a;现如今&#xff0c;企业在会议管理方面对OA系统的需求越来越高。因为会议是企业内部沟通和协作的重要环节&#xff0c;一个高效的会议管理系统可以帮助企业提升会议效率、降低成本&#xff0c;并且提高内部信息共享的效果。 目录 一&#xff0c;以下是OA系统在…

C语言实现通讯录--动态版

一、题目要求 实现一个通讯录&#xff0c;联系人的数量可多可少 二、解题思路 1.在静态版本的基础上改用动态的方法&#xff1a; &#xff08;1&#xff09;默认能够存放三个人的信息 &#xff08;2&#xff09;不够的话&#xff0c;每次增加两个人的信息 2.其他功能不变 三…

学习自动化测试该怎么学?6个步骤轻松拿捏

自动化测试作为脱离手工测试的基本核心内容&#xff0c;其重要性不言而喻了&#xff0c;而且我们来看近期大厂的一些招聘信息显示&#xff0c;基本上自动化测试是必备前提&#xff0c;没有这个基本就不用谈后面的问题了&#xff0c;下面我们通过联想集团的一个软件测试工程师的…

【C#】async和await 续

前言 在文章《async和await》中&#xff0c;我们观察到了一下客观的规律&#xff0c;但是没有讲到本质&#xff0c;而且还遗留了一个问题: 这篇文章中&#xff0c;我们继续看看这个问题如何解决! 我们再看看之前写的代码&#xff1a; static public void TestWait2() {var t…

VR党建主题数字互动虚拟展馆软件开启党建铸魂育人新篇章

当今时代新媒体技术的发展对大学生的学习、生活等产生着深远的影响。高校作为党建育人的重要场所&#xff0c;充分借助VR技术的强大优势&#xff0c;合理运用到育人工作中&#xff0c;能够不断丰富教育内容。VR智慧党建展厅展馆结合VR技术营造的虚拟现实空间&#xff0c;将党的…

layui手机端上传文件时返回404 Not Found的解决方案(client_body_temp权限设置)

关于 1.client_body_temp的作用 client_body_temp是一个指令指定保存客户端请求体临时文件的目录路径&#xff0c;以及是否进行缓存的配置指令。 在Web服务器中&#xff0c;当客户端向服务器发送请求时&#xff0c;请求体中包含了请求的主体部分&#xff0c;比如表单数据、上…

基于flask徐州市天气信息可视化分析系统【纯干货分享,附源码04600】

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对天气信息等问题&#xff0c;对天气信息进行…

【网络通信】一文读懂TCP/IP基础,IP、端口、网关、web、超媒体

TCP/IP贯穿在我们学习计算机的生涯中&#xff0c;但TCP/IP终究是个什么玩意儿&#xff1f;在了解他之前我们先看一段历史&#xff1a; 在网络发展初期&#xff0c;许多研究机构、计算机厂商和公司都开始大力发展计算机网络。自ARPANET出现之后&#xff0c;许多商品化的网络系统…

实现二叉排序树

一&#xff1a;二叉树和二叉搜索树 二叉树中的节点最多只能有两个子节点&#xff1a;一个是左侧子节点&#xff0c;另一个是右侧子节点。这个定义有助于我们写出更高效地在树中插入、查找和删除节点的算法&#xff0c;二叉树在计算机科学中的应用非常广泛。 **二叉搜索树&…

Consul的容器服务更新与发现

Consul的容器服务更新与发现 一&#xff1a;Docker consul的容器服务更新与发现&#xff08;1&#xff09;什么是服务注册与发现&#xff08;2&#xff09;什么是consulconsul提供的一些关键特性&#xff1a; 二&#xff1a;consul 部署consul服务器1. 建立 Consul 服务2. 查看…

一文带你全面理解向量数据库

近些年来&#xff0c;向量数据库引起业界的广泛关注&#xff0c;一个相关事实是许多向量数据库初创公司在短期内就筹集到数百万美元的资金。 你很可能已经听说过向量数据库&#xff0c;但也许直到现在才真正关心向量数据库——至少&#xff0c;我想这就是你现在阅读本文的原因…

美国过境签证的办理流程和注意事项

美国过境签证是一种临时签证&#xff0c;允许你在前往其他国家的途中经过美国。这对于很多旅行者来说是一个便捷的选择&#xff0c;但在申请和办理过程中也需要注意一些要点。 首先&#xff0c;申请美国过境签证需要前往美国驻中国大使馆或领事馆递交申请。以下是办理美国过境签…

四磺酸酞菁锌,61586-86-5,Zn(II) Phthalocyanine tetrasulfonic acid,广泛用于染色

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 四磺酸酞菁锌试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;四磺酸酞菁锌 英文名称&#xff1a;Zn(II) Phthalocyanine tetrasulfonic acid CAS号&#xff1a;61586-86-5 分子式&#xff1a;C32H…

图数据库实践 - 如何将图数据库应用于网络安全

网络化办公为企业创造便捷的同时&#xff0c;也带来了数据泄露的威胁。根据IBM Security最新发布的年度《数据泄露成本报告》显示&#xff0c;2023全球数据泄露的平均成本达到445万美元&#xff0c;创该报告有史以来以来最高记录&#xff0c;也较过去3年均值增长了15%。同一时期…

2.3 HLSL常用函数

一、函数介绍 函数图像参考网站&#xff1a;Graphtoy 1.基本数学运算 函数 含义 示例图 min(a,b) 返回a、b中较小的数值 mul(a,b) 两数相乘用于矩阵计算 max(a,b) 返回a、b中较大的数值 abs(a) 返回a的绝对值 round(x) 返回与x最近的整数 sqrt(x) 返回x的…

QT【day4】

chat_QT服务器端&#xff1a; //.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> //服务器类 #include<QTcpSocket> //客户端类 #include<QMessageBox> //对话框类 #include<QList> //链表容器 #inc…

美团/华为/字节/滴滴等大厂真实面试面经

一、美团测试开发面经 一面&#xff0c;1小时 自我介绍 自已觉得最好的项目&#xff1f;主要做了什么&#xff1f;遇到的最大困难&#xff1f; 浏览器输入网址后发生了什么&#xff1f; 三次握手和四次挥手 http和https的区别 https的加密过程 知道哪些排序算法 快排的…

现在入行软测=49年入国军?三句话,让面试官再掏2K

还有一个月就步入金九银十&#xff0c;很多软测人吐槽因为疫情&#xff0c;公司都在裁员&#xff0c;别说跳槽涨薪&#xff0c;能保住现在的工作就不错了。 但也有那么一批人&#xff0c;凭借自己口才与实力拿到年薪近50W的offer。面试是初见1小时就要相互了解优缺点的过程&am…

工作10年的老码农手把手教你如何3分钟看懂IT技术管理!速收藏!

老陈是谁&#xff1f; 一个码龄十年的老码农&#xff0c;从刚毕业开始被代码折磨的死去活来&#xff0c;到公司里“被迫”成为多线技术栈的“工程师”&#xff0c;这几年又从IT技术转向做IT管理。 基本可以说从一个坑跳到了另一个坑&#xff0c;虽然坑多水深&#xff0c;但是…

【Golang】Golang进阶系列教程--Golang中文件目录操作的实现

文章目录 一、文件二、文件目录三、文件目录操作3.1、读取文件3.1.1、方法一 (file.Read())3.1.2、方法二 (bufio读取文件)3.1.3、方法三 (ioutil 读取方法) 3.2、写入文件3.2.1、方法一3.2.2、方法二3.2.3、方法三 (ioutil写入文件) 3.3、复制文件3.3.1、方法一3.3.2、方法二 …