ubuntu x86_64 配置 aarch64 交叉编译环境
概念
交叉编译的简介可以交叉编译详解 一 概念篇 和 Introduction to cross-compiling for Linux
简单理解为:
在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序。比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。
当前手头有个项目,目标平台是 aarch64 的嵌入式平台,但开发工作是在 x86_64 架构下的 Windows 或者 Ubuntu 系统上进行的, 如果每次开发完,都去嵌入式平台上编译,不仅耗时费力,很多时候嵌入式平台的内存都要爆掉。因此,搭建一个交叉编译环境,在开发平台上编译,在目标平台上运行,显得尤为重要。
环境搭建
在参考了 Ubuntu安装arm-linux-gcc交叉编译器 后,了解到,在 ubuntu 上,既可以使用包管理的方式安装交叉编译器,也可以手动安装较新版本的。arm-linux-gcc 的交叉编译器 7.5 以前的版本由 linaro 维护,可以在 ...
Qt中的反射机制
什么是反射?
反射是指在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。在 Java 中,反射是通过JVM实现的。JVM在得到class对象之后,再通过对class对象进行反编译,从而获取对象的各种信息。
可以参考 廖雪峰的官方网站 来帮助理解。Java 不是我们这篇文章的重点。
简单来说,如果编译不知道类或对象的具体信息,比如我们在搭 Java的SSH或者SSM框架的时候,类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息,此时就可以用反射来实现。
下面的代码来自 Java反射机制-十分钟搞懂
123456789101112131415161718public class Test { public static void main(String[] args) throws Exception { //编码/编译的时候,已经知道要创建哪个类的对象,此时和反射没关系 Animal an = new Cat(); an.nickName =&quo ...
Nginx实现授权访问
有需求如下:公网上搭建文件服务器,但为了防止人人都可以下载,需要经授权的人才可访问。对于经过公网的流量,一般做如下安全措施:
只能允许已知的 IP 访问。
流量需要加密。
实现方式
本文只借助
Linux 图形界面的显示原理
显示服务(Display Server)
参考Linux 图形界面的显示原理是什么? - silaoA的回答 - 知乎,Linux 图形界面的显示原理是什么? - 韩朴宇的回答 - 知乎
大名鼎鼎的X窗口系统(X Window System,也可以叫做 X11 或者 X)是1980s由MIT提出的以位图图像显示图形化界面的一套软件规范及协议,之所以叫“X11”是因为目前是该协议迭代的第11个版本。可以在终端运行 sudo X -version 来查看:
12345678X.Org X Server 1.21.1.4X Protocol Version 11, Revision 0Current Operating System: Linux lsn-Y9000X 6.2.0-37-generic #38~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 2 18:01:13 UTC 2 x86_64Kernel command line: BOOT_IMAGE=/@/boot/vmlinuz-6.2.0-37-generic root=UUID=a ...
我的Arch Linux配置
享受极简主义的世界
CMake简洁使用说明
最简单的情况
main.cpp
12345678#include <cstdio>void hello();int main() { hello(); return 0;}
hellp.cpp
12345#include <cstdio>void hello() { printf("Hello, world\n");}
CMakeLists.txt
1234cmake_minimum_required(VERSION 3.12)project(hellocmake LANGUAGES CXX)add_executable(a.out main.cpp hello.cpp)
将 hello.cpp 和 main.cpp 生成一个可执行文件
库
静态库
静态库可以当成多个 .o 文件的打包,相当于直接把代码插入到生成的可执行文件中,会导致生成的可执行文件体积变大。
而动态库则只在生成的可执行文件中生成“插桩”函数,当可执行文件被加载时会读取指定目录中的 .dll 文件(或 .so),加载到 ...
pkg-config用法详解
本文是转载自简书pkg-config用法详解,并根据自己的环境修改。
背景
当开发过程中使用第三方库时,我们需要知道被使用的第三方库,它包含的头文件在哪儿、它依赖哪些库、它的编译选项有哪些、它的链接选项有哪些等等,也就是说需要知道这些信息我们才能正确的编译和链接它。当然可以通过直接在编译选项中指定的方式来使用,但是,对于一些大型或者比较复杂的第三方库,包含的头文件或者依赖库非常多、非常复杂的时候,这样做的成本就非常高,而且非常不便于在不同平台之间的移植。
pkg-config 就是解决这个问题的一种方案。
pkg-config 是什么
pkg-config 是一个用于获取系统中安装的包/库的相关信息(例如依赖头文件目录、依赖库文件目录)的程序,通常用于编译和链接一个或多个库,典型的用法为:
12345# Makefileprogram: program.c cc program.c `pkg-config --cflags --libs XXX` # 此处的XXX表示库名称,(数字1左边的符号)
注意符号 `,不是引号,而是重音符
pkg- ...
CMake的两种模式
本文主要总结了 find_package 的两种搜索模式:Module 模式和 Config 模式,对每种模式,都写了两个示例,分别搜索第三方库和自己写的测试库,相关代码在文章中可以找到。
类模板中的编写方式及友元函数在类模板中的使用
实现方式
编译器有差别,在windows中和在linux中的实现方式不同。
在VS 编译器下
在VS编译器下可以这么实现:
test.cpp
123456789101112131415161718192021222324252627282930313233343536373839404142434445#include <iostream>using namespace std;template<class T>class Person {public: Person(T age, T id); void show(); template<class T> friend ostream& operator<<(ostream& os, Person<T>& p); template<class T> friend void print_person<T>(Person<T>& p);private: T m ...
STL各容器的基本操作
分配器
allocator 是一种 STL 标准,不同的编译器有不同的实现。
直接使用分配器,分配 512 个字节的整数。
12int* p = allocator<int>().allocate(512);allocator<int>().deallocate(p, 512);
注意 allocator<int>()语法,这里产生了一个临时对象(见《STL源码剖析》36页)。
VC、BC5、G2.9 的分配器没有任何独特设计,它们就是调用了 C 的 malloc() 和 free() 来分配和释放内存,而且它们的接口设计使得我们不太容易去用(没有程序员会去记忆申请的时候申请了 512个字节,释放的时候再释放 512 字节)。
G2.9 里面各种容器的默认分配器是 alloc,其实现如下 <stl_alloc.h>,其设计了 16 条单向链表,分别负责以 8 为倍数,不同字节大小的区块(例如 0 号链表负责大小为 8 字节的块,15 号链表负责大小为 128 字节的块)。这个设计节省了很多每次 malloc 时内存的额外开销。
G4.9 ...
How to Use Inline Assembly Language in C Code
内核代码中经常会见到内联汇编的使用,读起来丈二和尚摸不着头脑,本文是对文章 *GCC-Inline-Assembly-HOWTO* 的翻译,希望可以帮助到学习内联汇编的人。
站在巨人的肩上之操作系统篇(三)
__attribute__((packed))
最近在写结构体的时候经常遇到下面的这种代码
12345// GDTRtypedef struct { uint16_t limit; // 全局段描述符限长 0 ~ 15 uint32_t base; // 全局段描述符表32位基地址 16 ~ 47} __attribute__((packed)) gdt_ptr_t;
__attribute__关键字主要是用来设置函数属性(Function Attribute)、变量属性(Variable Attribute)、类型属性(Type Attribute)。也可以修饰结构体(struct)或共用体(union)。设置属性的主要目的在于让编译器进行优化。
写法为__attribute__ ((attribute-list)),后面的 attribute-list 大概有6个参数值可以设置:aligned, packed, transparent_union, unused, deprecated 和 may_alias。(详情请参见GCC文档)
而 pack ...
Ubuntu安装完后的个人设置
一个在 ubuntu 的世界里摸爬滚打了5年的技术小白的总结,适用于 ubuntu18, ubuntu 20, ubuntu 22。
计网复习记录
网络体系结构
OSI7层模型和计算机网络5层模型
//TODO
为什么有了7层模型还需要5层模型?
//TODO
链路层
流量控制
链路层的流量控制是点对点的,传输层的流量控制是端到端的。
数据链路层流量控制手段:接收端收不下就不回复。
传输层流量控制手段:接收端给发送端发送一个窗口公告。
停等协议
每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个帧。这是一种特殊的滑动窗口协议(窗口大小为1)。
滑动窗口协议
后退N帧协议(GBN)
选择重传协议(SR)
网络层
ip地址决定最终要到哪台计算机,mac地址决定下一跳给谁
ip地址分类及特殊地址
计算机A和B通信过程
IP数据报
详情见王道P144页
TTL
TTL用以确保ip数据报分组不会永远在网络中循环。路由器在转发分组之前,先把TTL减1,若TTL被减为0,则将该分组丢弃。
可以在ping一个地址的时候,通过-i参数指定TTL的大小,以此来追踪该数据报都经过了哪些网关
协议
数值1表示ICMP,6表示TCP,8表示EGP,17表示UDP,41表示IPV6
首部校验和
只校验分组的首部,不校验 ...
左神算法基础班第三周
二叉树遍历
二叉树结构体定义
12345678struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}};
先序遍历
力扣144题
递归
12345678910vector<int> order = {};vector<int> preorderTraversal(TreeNode* root){ if (root) { order.push_back(root-&g ...
CMake菜谱(二)
Chapter 3
在学习的过程中总结的关于python路径的一些问题
ubuntu中自带了python,我的ubuntu版本是20.04,python版本是3.8,但是不像自己编译安装一样,ubuntu把这个python安装到了很多的地方。
首先,默认是没有安装pip的,可以通过sudo apt install python3-pip来安装。
然后,再使用pip来安装python的一些模块的时候,这些模块被安装到的路径是由USER_SITE变量来决定的。可以通过python3 -m site来查看这些信息。比如我的就是
12345678910111213~ ❯ python3 -m site sys.path = [ '/home/lushuangning', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/home/lu ...
CMake菜谱(一)
序
不知道从什么地方开始写起,后面慢慢补吧。CMake 系列学习源自CMake-Cookbook,一本翻译来的书。作者提供了书中的源代码,我自己学习的过程中手动码了一遍,放在了MyCmakeExample
中文版在线网站CMake Cookbook,本书中的绝大部分内容源自该中文版翻译,在此只是为了做个学习上的记录,以后项目中用到的时候方便查找,可自由转载。
Chapter 1
chapter 1.1 对单个源文件编译
配置项目
生成构建器的命令:
123$ mkdir -p build$ cd build$ cmake ..
等效于
1$ cmake -H. -Bbuild
构建项目
构建命令:
1$ cmake --build .
后面可以带参数,详情如下
123456789101112$ cmake --build . --target helpThe following are some of the valid targets for this Makefile:... all (the default if no target is provided)... cle ...
左神算法基础班第二周
哈希表和有序表
在 C++ 中,用 unordered_map 替代了 hash_amp。
在 Java 中,基本数据类型 byte, short, int, long, float, double, char, boolean 以及其对应的对象类型如 Integer, String等在哈希表内部按值传递。除此以外按引用传递。
链表
链表结构
单链表:
1234567struct ListNode{ int val; ListNode *next; ListNode(): val(0), next(nullptr){} ListNode(int x) : val(x), next(nullptr){} ListNode(int x, ListNode *n) : val(x), next(n){}};
双向链表:
12345678struct DoublyListNode{ int val; DoublyListNode *pre; DoublyListNode *next; D ...
平方根倒数快速算法
快速平方根倒数算法也称为平方根倒数速算法(Fast Inverse Square Root)是用于快速计算的一种算法。此算法由于出现在《雷神之锤III竞技场》源代码中而被人们所熟知。此算法最早被认为是由约翰·卡马克所发明,但后来的调查显示,该算法在这之前就于计算机图形学的硬件与软件领域有所应用,此算法至今为止仍未能确切知晓算法中所使用的特殊常数的起源。
早已听闻这个算法的大名,这几天在做履带车的项目,无意中在树莓派上的源码里发现了这段代码:
123456789101112131415161718/**************************************Date: May 31, 2020Function: 平方根倒数 求四元数用到***************************************/float InvSqrt(float number){ volatile long i; volatile float x, y; volatile const float f = 1.5F; x = number * 0.5F; y ...
Qt5下Socket通信demo
写在前面
本文是Qt5下使用socket通信的一个示例,通过该示例,你可以学到:
Qt5下信号与槽的使用方式
Qt中线程与线程之间的通信方式
拉姆达表达式的简单使用
Qt5下Socket通信的流程
界面样式
客户端启动后的页面如上图所示,端口默认为6665,IP为127.0.0.1,连接服务器按钮可点击,断开连接和发送信息按钮不可点击,左下角连接状态后面的图片为一把红色的锁。
服务器启动后的页面如上图所示,监听端口默认为6665,启动监听按钮可点击,左下角连接状态后面的图片为一把红色的锁。
当点击服务器的启动监听按钮后,该按钮变为不可点击,此时点击客户端的连接服务器按钮,如果连接成功,客户端的历史信息一栏将会出现“连接服务器,成功!”的信息,连接服务器按钮变为不可点击,断开连接和发送信息按钮变为可点击。同时,服务器和客户端左下角连接状态后面的图片都会变为一把绿色的盾牌。如上图所示。
当客户端点击断开连接按钮,三个按钮的状态将会回到客户端启动的时候,客户端的历史信息栏将会多出一条“与服务器断开连接”的信息,同时服务器和客户端左下角连接状态后面的图片都会变为一把红色的锁。如上图所 ...