闲置笔记本改NAS-OMV踩坑记录

这不是一篇教程,所以不涉及omv从0到1的安装过程。网上教程很多,但是跟着做下来还是遇到很多问题(装了好几天>:),本篇的目的是记录我在omv安装过程中遇到的一些问题以及解决方法(不涉及原理)。


cmake链接ndk交叉编译

需求: 用CMake构建和编译生成的算法库, 作为动态共享库link到Android项目.

配置

在Android项目的Android.mk中添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
include $(CLEAR_VARS)
LOCAL_PATH          := $(XXXX_PATH)
LOCAL_MODULE        := libxxx
LOCAL_MULTILIB      := 64
LOCAL_SRC_FILES_64  := ./algo/libxxx.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_PROPRIETARY_MODULE := true
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

NULL和nullptr实际问题分析

在C++中推荐使用nullptr代表空指针,虽然我一直坚持这个原则,但是实际开发中没有遇到非nullptr不可的情况,直到写了以下代码(已脱敏):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
template <typename F, typename... Args>
using func_t = typename std::result_of<F(Args...)>::type;

template <typename F, typename... Args,
          typename Rp = func_t<F, Args...>,
          bool is_void_v = std::is_void<Rp>::value>
inline Rp call(F &&func, Args &&...args)
{
    //...
}

C++类的内存分布(二)

《C++类的内存分布》中, 我们使用gdb大概了解了C++类的内存结构, 并得到了以下结论:

  • 类成员函数只有一份,所有实例共享
  • 类的成员变量有多份,不同实例维护不同的成员变量
  • 即使是继承关系,派生类的成员变量也只是基类的复制体,而不是指向同一块内存
  • 派生类会把从基类继承过来的成员变量当做自己的普通成员变量一样看待
  • 类的虚表只有一份,所有实例共享
  • 编译器在编译的时候, 通过给类添加__vptr指针指向虚表而得到虚表地址.

本文主要目的是扩展vptr和vtable部分, 深入了解C++多态的实现原理.


glibc-fopen源码阅读-补充篇-open系统调用

上一篇《glibc-fopen源码阅读》讲到了fopen是怎么工作的,以及FILE是怎么和文件关联起来的。但是再次阅读之后,发现还是有些细节存在疑问:

  1. 系统调用openat怎么就拿到了fd
  2. struct file怎么和文件内容关联起来的,什么时候关联起来的?

带着以上疑问,继续阅读系统的open类函数。不过仅了解fopen也是可以的,并不影响对glibc的文件打开过程的理解。