- 博客(234)
- 资源 (28)
- 收藏
- 关注
原创 android-ndk开发(11): 安装 repo 命令
repo 的官方下载地址: https://storage.googleapis.com/git-repo-downloads/repo。恭喜你, 折返回到清华大学镜像: https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/repo 的官方介绍页面: https://gerrit.googlesource.com/git-repo/
2025-05-09 22:12:14
319
原创 android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘
是在 Android API 26 新增的函数, 在 cmake configure 阶段需要传入或更高版本。这在 Android C 标准库 bionic 的文档里有提及: https://android.googlesource.com/platform/bionic.git/+/refs/heads/main/docs/status.md。
2025-05-08 21:58:41
490
原创 android-ndk开发(9): undefined reference to `__aarch64_ldadd4_acq_rel` 报错分析
gcc 9.3.1 和 clang 12.0.1 添加了编译选项, 用来开启 LSE (Large System Extension), 用于在 Armv8.1-a 上改善多核情况下的原子操作的性能。这个选项在 gcc 9 和 clang 12 是默认不开启的, 相当于是默认开启了。从 gcc 10 和 clang 13 开始默认开启编译选项。ndk 版本和 clang 版本有对应的关系, clang >= 13 对应到 ndk >= r24。
2025-05-08 21:56:21
635
原创 android-ndk开发(8): ndk 和 clang 版本对照表
本文给出了查阅 ndk 各个版本 changelog 的方法, 包括 wiki 网站, 和 ndk 源码仓库, 这些 changelog 提供了比较详细的信息。 本文还给出了 ndk 和 clang 版本的对照表, 包括 ndk 字母形式的短版本、 纯数字的版本, 而对应的 clang 版本,则能用于和上游 LLVM 的版本变更做联动的分析。
2025-05-06 17:52:08
803
原创 android-ndk开发(7): 从库文件反推ndk版本
本文提供了在在 android-ndk 平台上, 从库文件反推出编译它的 ndk 版本的方法: 对于动态库, 可以用 parse_elfnote.py 提取;对于静态库, 则需要编译时写入字符串。对于 OpenCV 这个静态库, 我们反推了4个常用版本对应的 ndk 版本。这些 ndk 版本信息, 在一些编译、链接报错的分析中, 会提供帮助。
2025-05-06 17:29:52
1006
原创 android-ndk开发(6): 查看反汇编
给出了 android-ndk 程序查看反汇编代码的方法, 包括单个可执行文件、 基于 cmake 构建时的每个源代码文件。 简要提及了反汇编典型使用场景: crash 分析、 性能分析.
2025-05-05 23:42:08
630
原创 android-ndk开发(5): 编译运行 hello-world
批判了 anroid ndk 官方故意使绊子的问题。 给出了绝佳的 android-ndk hello-world 控制台可执行程序的例子。
2025-05-05 22:57:40
818
原创 android-ndk开发(4): linux开发机有线连接android设备
本篇给出了 Linux 开发机上, 配置 udev 规则的步骤和注意事项, 从而让后续通过 USB 线连接设备时, 能自动识别设备, 顺畅的使用 adb 命令。
2025-05-05 22:07:27
607
原创 android-ndk开发(2): macOS 安装 ndk
给出了 android-ndk 在 r23 之前和 r23 之后, 分别在 macOS 上如何安装的说明
2025-05-05 21:28:08
431
原创 adb无线调试步骤
adb pair 和 adb connect 用到的端口号,不是同一个. 这个弄错可能导致连接不上。adb 可执行文件需要放到 PATH 里。端口号每隔一段时间会变化。
2025-05-05 17:26:08
670
原创 C++: Initialization and References to const 初始化和常引用
这个转换,是生成「临时的」 MyFuncs 对象。这个所谓的「临时的」,可以认为是匿名的、编译器生成的。这样的匿名对象,声明周期是有限的:发生在。匿名对象马上就「死了」,你还取地址;那以后再用这个匿名对象,就是使用「鬼魂」,本质是使用非法内存。那肯定crash啊。为啥说是临时对象的地址?因为 引用的本质是 别名(alias);取引用的地址, 其实,就是取匿名对象的地址。上述代码会 crash。如果开启 ASAN 则能发现非法内存访问。这是一段很容易被忽略、 但是又非常重要的内容。
2025-04-15 22:38:07
662
原创 C++ const引用绑定到字面量的本质
这看起来像是「创建了字符串字面量的引用」,但其实是创建了临时的、匿名的字符串对象,然后绑定到了这个临时的、匿名的字符串对象上的引用。其中「无名」意思是,编译器的具体实现。须知,双下划线的标识符,用户代码是不能那么写的,它们是给编译器保留使用的。编译器会处理为:创建一个「无名」(双下划线替代)变量;普通的引用,必须绑定到对象上,不能绑定到 literal 上;这篇 stackoverflow 问答给出了解释: 当你写。
2025-04-13 10:10:56
303
原创 C++标识符:检查是否和保留字冲突
最基本的要求: 字母、数字、下划线组成, 并且不能是数字开头。禁忌1: C++ 关键字不能用做标识符。 它们是:禁忌2:不能包含两个连续的下划线。禁忌3:不能以下划线 + 大写字母开头。禁忌4:函数外面定义的标识符, 不能以下划线开头。禁忌5:宏定义也是 identifier,也需要遵循前面提到的要求: https://en.cppreference.com/w/cpp/preprocessor/replace禁忌6:和已有宏定义同名, 例如 #include <windows.h> 后, 默认会引入 s
2025-04-12 22:59:44
485
原创 C++: char类型既不是signed char也不是unsigned char
对于 char 类型, 增加 signed, 类型变了。char 既不是 signed char, 也不是 unsigned char。虽然 char 的取值范围, 一定是:要么是 signed char 范围, 要么是 unsigned char 范围。对于 int, short, long, long long 类型, 增加 signed, 类型不变。如下代码在 Apple Clang 15.0.0 下运行。
2025-04-12 10:28:36
154
原创 WSL使用经验
如果在 WSL 中安装了多个 Linux 发行版,默认的hostname不要区分它们。考虑修改 hostname, 例如改为。WSL 里的 Ubuntu, hostname 默认形如。
2025-04-04 13:07:03
118
原创 win11安装绕过微软账号
全新安装 Windows11, 一开始连接了 wifi, 发现后面必须登录微软账号, 想起来之前被截断用户名只显示前5个字母的情况, 需要规避。会自动重启进入全新安装, 注意跳过 wifi, 并使用本地账号登录。解决思路: 先删除 wifi 网络的记录, 然后重新执行安装。shift+F10 调用出 cmd, 执行。
2025-03-29 10:37:39
162
原创 成为Python砖家(7): 使用miniforge管理Python版本
注意, miniconda 也是 anaconda 的一部分, 也应当避免使用。anaconda 官方的说辞是, 用户使用了他们的 repo 存储的包。先前使用 anaconda, 后来切换到 miniconda。不变的是: 从未使用过 conda channel 的东西。conda 对我而言, 只是创建、切换不同 python 版本的工具。既然如此, 切换到 miniforge 是毫无波澜的,没有任何不适应。唯一要说的是, 有什么好处: 规避 anaconda 公司的律师函。
2025-03-15 20:49:35
260
原创 成为git砖家(9): rebase进阶: 拆分commit为多个
当一次性 git add 了多个修改点, 并且快速的执行了 git commit 后, 你觉得有点懊恼: 明明可以独立为两次或多次 commit, 揉在一块导致历史记录不太清晰。我们知道,对于已经存在的多个commit如果要合并起来,那么 rebase 是相当简单的。也是可以用 rebase 来做的,用到的是。git commit 后我后悔了,想要拆解为3次 commit,每次一个函数。重复 git add, git commit 动作, 直到满意。例如我最近一次 commit 需要被拆分, 它是。
2025-03-11 22:13:26
461
原创 小米手机HyperOS 2.0开启USB调试
小米手机, 升级系统到 HyperOS 2.0 之后 adb shell 不显示手机, 需要重新启用 USB 调试.设置 -> 我的设备 -> 全部参数与信息, 找到 “OS 版本”, 连续点击5次.设置 -> 搜索 “USB调试”, 开启并确定.弹窗“允许 USB 调试吗?
2025-03-08 23:01:11
526
原创 cmake压缩或解压文件
有两种主要方式。第一种,执行外部命名,通常用cmake -E系列。第二种,用file()命令。下面以解压为例,压缩同理。
2025-02-09 10:22:11
309
原创 github release页面的zip和tar.gz有什么区别?
一个例子:FFmpeg 编译后的产物里,有符号链接文件。如果是在 Windows 系统上,交叉编译到 linux-arm64 平台,并且需要用到 FFmpeg 的库文件, 而 Windows 并能很好的支持符号链接文件, 就会比较棘手。需要在解压阶段, 处理好符号链接文件。如果被打包的内容都是文本文件,那么通常 .zip 和 .tar.gz 内容完全一致。对比 .zip 和 .tar.gz, beyond compare 显示完全一致。例如 cereal 库是 header-only 库,提供一堆头文件。
2025-02-09 10:04:28
522
原创 naivecv的设计与实现(3): NV12到RGB的转换
通过搜索github,得到了用于测试的 NV12 图像。基于对 NV12 图像格式的理解,用C语言读取了 NV12 图像内容。遍历 NV12 的 UV 平面,并得到对应的 Y 平面的像素点, 从而得到了一组 RGB 像素值;由于每个 UV 是被 2x2 的 4个Y共享的,因此, 先获取剩余的3个 Y, 然后算出三组 RGB 像素值。这样一来就写入了 dst rgb 图像的 2x2 像素区域,进而完成了整个 NV12 到 RGB 的图像格式转换。
2025-01-25 20:44:59
424
原创 naivecv的设计与实现(1): 版本号
打算写一个图像处理基础库 naivecv, 如名字所示, 是个人练手项目。使用 C API, 具体实现可以用C++。本篇记录版本号的设计和实现。
2025-01-25 12:48:02
337
原创 C++ Primer Notes(5): 复合类型
Compound Type 复合类型指的是基于其他类型定义的类型,C++中最基本的复合类型有两类:指针类型, 引用类型。回顾和提升了对于变量声明的格式,以往的简单声明,格式是type name;现在则改为, 其中 type_modifier 在本章是和两种,分别表示指针 和 引用(左值引用)。也可以复合了和使用,意思是指针类型的引用类型,如int a = 3;其中c是引用类型,base_type 是int*提到了引用类型必须初始化,因为绑定到了已经存在的对象,引用则不会创建新的对象。
2025-01-12 12:51:17
980
原创 C++ Primer Notes(3): 哪些人可以看C++ Primer
在知乎搜索 “C++ Primer”,靠前的一个问答是。本篇挑选一些观点,予以批评。
2025-01-11 23:04:36
901
原创 C++ Primer Notes(1): Chapter 1 Getting Started
趁着最近请假静养,时间稍微多那么一点,再试一次。而看中文版 pdf 时,一方面是清晰度不足, 另一方面是中文容易让我觉得“熟悉”而跳过内容, 并且有些翻译后的内容对应到的英文我并不能100%对应上,因此这次试着读英文原版。而习惯了每天让 AI 喂饭的我们, 在提高效率的同时, 静下心来看书、练习编程,可能更能让学习编程语言回归到兴趣。前面一个例子是计算两个数字的加法, 并通过使用 while 和 for 循环,扩展到了计算一个区间内的数字的和。下一个程序,是统计给定的整数序列中,每个数字出现的次数。
2025-01-07 22:43:31
702
原创 C/C++的printf会调用malloc()
排查内存问题(或相关的疑难杂症)时,可能一句printf就能让bug出现,或者赶走bug。你可能觉得很神奇,但这并不神奇。至少我们可以在 Linux-x64 下,通过 malloc hook,来验证当前的编译环境下, printf 确实是调用了 malloc。而 malloc 底层也不是吃素的, 默认是 glibc 的 ptmalloc 这个内存管理器, 如果本身你的程序把内存控制块写坏了, 继续 malloc 那就容易出现问题, 也就表现为 printf 影响了 bug 的出现。来看代码。
2025-01-06 23:37:38
426
原创 C++库 CLI11 介绍和使用
CLI11 是一个 single-header-only 库, 用于命令行解析。CLI11 的官方仓库是: https://github.com/CLIUtils/CLI11.git。
2025-01-01 21:23:13
1346
原创 半神器 PathFinder 使用体验
总的来说, Path Finder 确实补充了 Finder 的不足, 但是不如 Directory Opus 对于 Windows File Explorer 的改进那么大。Path Finder 的使用,也促使我对 Finder 的使用增加了经验。
2025-01-01 08:21:18
854
原创 开源软件 Double Commander 使用体验
前一篇写了神器 Directory Opus 的使用经验, 不过 Directory Opus 只支持 Windows 系统。macOS 自带的 Finder 的使用体验, 比 Windows Explorer 还要简陋, 尝试找 macOS 下的 Directory Opus 替代时,找到一款名为 Double Commander 的开源软件: https://github.com/doublecmd/doublecmd。
2025-01-01 07:23:27
724
仿BeyondCompare的两张图像比较功能,Qt5实现的源码工程
2022-05-01
emacs-27.1-x86_64.zip
2020-10-19
cmake-3.19.0-rc1-win64-x64.zip
2020-10-18
freeglut-3.2.1-vs2017-x64.zip
2020-10-16
cmake-3.18.4-win64-x64.zip
2020-10-13
OneFlow深度学习框架源码
2020-08-17
带Python3和CUDA10支持的Caffe
2020-08-17
cuDNN8-Developer-Guide.pdf
2020-08-16
cmake-3.18.0-win64-x64.zip
2020-08-16
cmake-3.18.0-Darwin-x86_64.tar.gz
2020-08-16
vulkansdk-linux-x86_64-1.1.126.0.tar.gz
2020-08-16
diffutils-3.7.tar.xz
2020-08-16
smartgit-linux-20_1_3.tar.gz
2020-08-16
cmake-3.15.0-Linux-x86_64.tar.gz
2020-08-16
Linux下懒人安装cudnn的脚本,适合任意cudnn版本
2020-08-16
逆透视变换IPM源码
2020-08-16
imageset-viewer.py
2020-08-01
WinCodeHelper.exe
2019-10-08
带cmake支持的protobuf2.6.1源码
2018-11-19
HOG+SVM原版C++代码,略修改,编译成功
2016-07-17
pedestrian_HOG_SVM_Inria_Caltech
2016-02-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人