Linux 开发系列笔记(1.4) - Makefile 基本使用
建站提交历史文章,原文写作时间 2023 年 2 月前后。
回到文章目录
基本使用
介绍
Makefile是一个用于便捷一键编译的工具。通过配置Makefile文件,使用make工具,可以迅速完成对于复杂项目的编译任务,不用每次键入如前文所述的多条Shell命令完成编译。
本章节将简单介绍Makefile的使用,满足基本需求。
关于Makefile的更多内容请见:
GNU make 官方文档
GNU Make 使用手册(中译版)_ZS_Wang_Blogs的博客-CSDN博客
基本语法
特殊字符:
字符
含义
$
变量符
#
注释符
*
逻辑通配符
%
模式匹配符
\
转义符
规则(核心):如下代码属于一条规则,一条规则通常是编译环节的一条命令。
12<target>: <source list ...> // <目标>: <依赖列表> // <sourve list> 可以是空, 使用空格分割 <shell command> // & ...
Linux 开发系列笔记(1.3) - 静态库与动态库制作
建站提交历史文章,原文写作时间 2023 年 2 月前后。
回到文章目录
静态库与动态库制作
介绍
库文件是计算机上的一类文件,可以把它当作是一个代码仓库,可以为程序提供变量、函数和类。
库文件与可执行文件差别不大,但是库文件不能直接运行。
库分为两种:静态库、动态库(共享库),静态库在编译时写入可执行文件,动态库在执行时读入内存。
库具有代码保密,部署与分发方便的优势。
静态库
命名规范:Linux:libxxx.a,Windows:libxxx.lib
静态库制作
首先自行安装ar工具。
假设我们的项目包括:main.c,head.h,add.c,sub.c,mul.c,div.c。
head.c文件位于include目录下,add.c,sub.c,mul.c,div.c位于lib目录下。
123$ gcc -c add.c sub.c mul.c div.c // 生成目标代码: add.o sub.o mul.o div.o$ ar src libcalc.a *.o // 建立静态库. s-索引, r-将文件插入备存文件中, c-建 ...
Linux 开发系列笔记(1.2) - GCC/G++ 基本使用
建站提交历史文章,原文写作时间 2023 年 2 月前后。
回到文章目录
GCC/G++ 基本使用
介绍
GCC原名GNU C Complier,GNU C语言编译器。现在GCC,GNU Complier Collection,由GNU开发的编译器套件,支持多种语言的编译,包括:C、C++、Objective-C、Java、Ada以及Go语言前端。
安装:sudo apt install gcc g++
标准:GCC/G++支持多种C语言与C++标准,编译参数为:-std=C99。
版本:gcc/g++ -v/--version
工作原理
预处理器:对C/C++代码进行预处理,包括消除注释、宏替换、头文件展开与优化
常用命令
命令
描述
gcc test.c
生成可执行文件 a.out
gcc test.c -o test
生成可执行文件 test
gcc test.c -c -o test.o
生成目标代码 test.o
gcc test.c -o test -I include -L lib -l libxxx.a
指定头文件 ...
Linux 开发系列笔记(1.1) - Linux 开发环境搭建
建站提交历史文章,原文写作时间 2023 年 2 月前后。
回到文章目录
Linux 开发环境搭建
安装虚拟机(或云服务器):VMware
自行获取,付费。
安装Linux系统:Ubuntu
https://releases.ubuntu.com/bionic/
下载并在VMware按照向导完成Linux虚拟机配置与安装。
你可能会关注到系统界面尺寸与屏幕尺寸不匹配,有如下解决方案:
Settings →\to→ Displays →\to→ 配置参数 →\to→ Apply
参数:
Resolution:(选择与你的电脑相近的分辨率)
Scale: 200%
安装 VMware-Tools,将自适应屏幕尺寸,还有一些其他功能。(我不会)
后续使用中,很少直接操作虚拟机界面,所以无需过于关注分辨率问题(多关注下面的内容吧)。
安装XSHELL、XFTP
https://www.netsarang.com/zh/free-for-home-school/ 经邮箱认证,提供免费家庭与学校版本。
XSHELL用于命令行控制远程主机,XFTP用于与远程主机交互文 ...
Linux 开发系列笔记(0) - 前言
建站提交历史文章,原文写作时间 2023 年 2 月前后。
前言
这是我在学习 Linux 系列时做的笔记。最近在学习青训营相关课程时想起来上传到个人博客。
整理自牛客网的一个课程:课程列表_牛客网 ,课程的全名叫做 Linux 高并发服务器开发。
目前这部分课程我还没有学完,想起来被我搁置半年了。
前置知识
Linux 系统常用命令,这一块我也有相关整理,虽然不适合小白:Linux 入门笔记 - Ubuntu
vim基本使用。
VSCode 基本使用。
C/C++ 基本语法。
目录
Linux 系统入门
1.1 Linux 开发环境搭建
1.2 GCC/G++ 基本使用
1.3 静态库与动态库制作
1.4 Makefile 基本使用
1.5 GDB 基本使用
1.6 文件操作与目录操作
1.7 虚拟内存地址
Linux 多进程开发
2.1 进程概述
2.2 进程基本控制
2.3 进程通信
2.4 守护进程
Linux 多线程开发
3.1 线程概述
3.2 线程基本操作
3.3 锁与线程同步
网络编程 ...
各种求逆元
前往 算竞题解 分类 || 前往 算竞模板 分类
简介
本文包括:费马小定理求逆元、扩展欧几里得算法求逆元、线性递推求逆元。
三者的区别
费马小定理求逆元:要求模是质数,复杂度 O(log2n)O(\log_2{n})O(log2n),最常用。
扩展欧几里得算法求逆元:不要求模是质数,复杂度 O(logn)O(\log{n})O(logn)。
线性递推求逆元:线性求出所有逆元,复杂度 O(n)O(n)O(n)。
模板题链接
下方模板自取,相关证明见下方链接相关题解。
洛谷 P3811 【模板】乘法逆元
费马小定理求逆元
123456789101112131415161718// 费小求逆元. 要求模是质数. 依赖: quick_pow. 复杂度: O(log(MOD)).const int MOD = 1000000007;// 快速幂int quick_pow(int base, int exponent) { int res = 1 % MOD; base %= MOD; while (exponent) { if (e ...
快速幂与光速幂
前往 算竞题解 分类 || 前往 算竞模板 分类
简介
本文将介绍:快速幂、龟速乘、矩阵快速幂、欧拉降幂、光速幂。
快速幂在众多数论中有非常重要的地位,也是其中最频繁用到的部分,朴素地求 aba^bab 时我们可以做到 O(n)O(n)O(n) 的时间复杂度,而快速幂将其提升到 O(log2n)O(\log_2{n})O(log2n)。
本文除了介绍快速幂还会介绍相关拓展,如上面列出。
快速幂
其实快速幂的思想很简单,我们可以求出 a, a2, a4, a8 …a,~a^2,~a^4,~a^8~\dotsa, a2, a4, a8 …,而任意所求的 aba^bab 一定可以表示成若干个 a2na^{2^n}a2n 的乘积,而这个数量级一定是 O(log2n)O(\log_2{n})O(log2n) 的。
链接: 洛谷 P1226 【模板】快速幂
123456789101112131415161718192021222324// 不带模数的快速幂, 基本不用int quick_pow(int base, int exponent) { int res = 1 ...
Lucas 与拓展 Lucas 求组合数
前往 算竞题解 分类 || 前往 算竞模板 分类
简介
LucasLucasLucas 定理用于处理带模数排列数的计算,O(n)O(n)O(n) 预处理,O(logn)O(\log{n})O(logn) 询问。
LucasLucasLucas 定理要求模数 ppp 为质数,而扩展 LucasLucasLucas 算法不要求,后者时间复杂度略高于前者,为 O(logplogm)O(\log{p}\log{m})O(logplogm)。
模板题链接
下方模板自取,相关证明见下方链接相关题解。
前置:各种求逆元、逆元求组合数、中国剩余定理、WilsonWilsonWilson 定理。
洛谷 P3807 【模板】Lucas 定理
洛谷 P4720 【模板】exLucas
Lucas 定理
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354// Lucas 定理求排列组合// 时间: O(log_MOD(n)) + 预处理: O(MOD)/ ...
Miller Rabin 与 Pollard Rho 大数分解
前往 算竞题解 分类 || 前往 算竞模板 分类
简介
在开始这篇文章前你一定对如何分解质因数有所了解,我们可以枚举 n\sqrt{n}n 个数进行试除,最坏时间复杂度为 O(n)O(\sqrt{n})O(n),如果使用素数筛优化,可以将复杂度降到 O(nlnn)O(\frac{\sqrt{n}}{\ln{n}})O(lnnn)。
而这里介绍的 Miller RabinMiller~RabinMiller Rabin 和 Pollard RhoPollard~RhoPollard Rho 算法是两种概率算法。Miller RabinMiller~RabinMiller Rabin 可以在 O(klog2n)O(k\log_2n)O(klog2n) 的时间内判断 nnn 是否为素数,其中 kkk 表示测试次数,测试次数越多,算法正确率越高。Pollard RhoPollard~RhoPollard Rho 在 nnn 不为素数时,可在 O(n1/4)O(n^{1/4})O(n1/4) 的时间内找到 nnn 的一个因数(111 除外),注意不一定是质因数。
这两种算法都有随 ...
Linux 入门笔记 - Ubuntu
本文为笔记,分为前章和正文两部分。全文介绍简略,适合有基础速通。
前章
Ubuntu 系统安装
下面提供三种安装方式,自行选择。
WSL (Windows Subsystem for Linux),Windows 官方支持的 Linux 子系统,可以参考 我的文章 。
虚拟机安装 Linux,传统的比较重量级的方式,可以参考 我的文章。
双系统安装 Linux,获取完备的计算机性能,但无法同时运行两个系统,可以参考 Windows 和 Ubuntu 双系统的安装和卸载 - Bilibili。
图形界面
虽然一般不会将 Linux 作为日用机,而是作为远程开发平台。但如果你打算将 Ubuntu 作为你的日用机的话,下面为你使用 Ubuntu 图形界面提供一些建议。
安装应用
应用程序安装方式主要有三种:apt、dpkg、snap、appimage。
其中 apt 可以直接从网络获取并完成安装,是 Ubuntu 上最常用的安装方式,正文会有介绍。
snap 提供沙盒化的软件安装,提供隔离的软件环境。
appimage 是一个可以直接运行的单体文件,无需安装过程,直接运行即可。
dpk ...