想在网站上放百度广告怎么做,wordpress模版文件夹,手机制作表格教程,南昌门户网站目录
软件包管理器
概念理解
用法示例 - 以yum为例
vim
模式的切换
常用操作
插件和配置
gcc/g
gdb
make / makefile 软件包管理器
概念理解
在Linux下安装软件的话#xff0c;一个比较原始的办法是下载程序的源代码#xff0c;然后进行编译#xff0c;进而得到…目录
软件包管理器
概念理解
用法示例 - 以yum为例
vim
模式的切换
常用操作
插件和配置
gcc/g
gdb
make / makefile 软件包管理器
概念理解
在Linux下安装软件的话一个比较原始的办法是下载程序的源代码然后进行编译进而得到可执行程序然后就可以运行这个软件了。但是这种做法太麻烦了于是就有些人把一些常用的软件提前编译好做成软件包放到服务器上通过包管理器可以很方便的获取到这个编译好的软件包直接进行安装即可。而负责管理这些软件包的东西就叫软件包管理器。软件包和软件包管理器之间的关系就好比手机上的 App 和 应用商店 这样的关系。
yum的实现过程大致可以概括为如下步骤 此引用部分摘自linux网络服务-部署yum仓库 - 掘金 先在yum服务器上创建 yum repository仓库在仓库中事先存储了众多rpm包以及包的相关的元数据文件放置于特定目录repodata下内含有软件的依赖关系和软件的位置当yum客户端利用yum/dnf工具进行安装时包时会自动下载repodata中的元数据查询元数据是否存在相关的包及依赖关系自动从仓库中找到相关包下载并安装 而不同的Linux发行版本通常使用不同的软件包管理器来管理和安装软件包。以下是一些常见的 Linux发行版本及其对应的软件包管理器 Ubuntu 和 Debian使用 apt 作为软件包管理器。 CentOS 和 Red Hat使用 yum 或 dnf 作为软件包管理器。在较新的版本中CentOS 8和Red Hat 8及其之后dnf 更为常见。 Fedora使用 dnf 作为默认的软件包管理器。 openSUSE使用 zypper 作为软件包管理器。 Arch Linux使用 pacman 作为软件包管理器。 Manjaro也是基于 Arch Linux所以同样使用 pacman 作为软件包管理器。 Linux Mint通常使用 apt类似于 Ubuntu。 注意这些发行版本中的软件包管理器可能会有不同的命令和选项因此在使用时需要查阅相关文档或指南以获取详细信息。
用法示例 - 以yum为例
yum源
yum仓库俗称yum源用于存放各种的软件包。需要安装软件的计算机连接到指定yum仓库来安装软件包。yum源就相当于一个软件包管理器类似于一个软件管家而yum源又有分为本地yum源和网络yum源绝大多数情况下我们使用的是网络yum源。 如果我们安装的是官方的系统镜像的话其使用的网络yum源基本都是国外官方的但国外的下载软件速度非常慢很多情况下都无法下载。所以国内一些大公司会做镜像以同步国外的软件。 所以我们可以配置使用国内的yum镜像源如腾讯源、阿里源、华为源等。
配置yum源的操作 - 以centos7腾讯源为例 首先我们直接网上搜索“腾讯源”然后打开这个网站腾讯软件源 (tencent.com) 接着找到centos然后点击右侧的查看 然后按照网页提示就可以直接安装了它已经贴心的把指令告诉我们了。CentOS (tencent.com) 腾讯软件源https://mirrors.tencent.com/help/centos.html yum的语法格式
yum [options] [command] [package ...]
参数说明 options 选项选项包括-h-y-q等等。 command 要进行的操作。 package 安装的包名。 常用选项 -h显示帮助信息 -y对所有的提问都回答“yes” -c指定配置文件 -q安静模式 -v详细模式 -d设置调试等级0-10 -e设置错误等级0-10 -R设置yum处理一个命令的最大等待时间 -C完全从缓存中运行而不去下载或者更新任何头文件 yum的常用命令
命令作用yum list查询所有可安装的软件包yum list package_name查询指定软件包的安装情况yum info查询所有可安装软件包的详细信息yum info package_name查询指定软件包的详细信息yum list updates列出所有可更新的软件清单yum list installed列出所有已安装的软件清单yum update更新所有软件包更新所有包同时也更新软件和系统内核yum -y upgrade更新所有软件包只更新所有包不更新软件和系统内核yum update package_name更新指定软件包yum install package_name安装指定软件包yum remove package_name删除指定软件包yum search keyword查找指定软件包 yum makecache 刷新缓存。把服务器的包信息下载到本地电脑缓存起来makecache建立一个缓存。以后用install时就在缓存中搜索提高了速度。配合yum -C search xxx使用不用联网检索就能查找软件信息。yum makecache fast将软件包信息提前在本地索引缓存用来提高搜索安装软件的速度,执行这个命令可以提升yum安装的速度。yum clean / yum clean all清除缓存目录下的软件包及旧的 headers。yum 会把下载的软件包和header存储在cache中而不自动删除。可以使用yum clean指令清除索引缓存和下载包的缓存。yum clean packages清除缓存目录下的软件包yum clean headers清除缓存目录下的 headersyum clean oldheaders清除缓存目录下旧的 headers
vim
注意这里只是简单的解释vim的一些基础用法使得我们可以快速上手使用vim。如果想要更深层次的学习vim可以自行探索这里我推荐一个很不错的教程这个人的主页也有很多关于vim的相关内容感兴趣的话可以好好看看Learn-Vim(the Smart Way) 中文翻译https://github.com/wsdjeg/Learn-Vim_zh_cn
如果觉得上面的内容太多了也可以看一下这个
Vim 命令速查表 - Chloneda - 博客园 (cnblogs.com)https://www.cnblogs.com/chloneda/p/vim-cheatsheet.html当然也可以参考这张很经典的图片 模式的切换
下面就让我们来快速上手使用vim。首先vim有很多模式不同的模式下对应着不同的功能虽然vim的模式有十几个但实际生活中最常用的也就3个normal命令模式、command底行模式、insert插入模式当然还有诸如v-block视图模式、replace替换模式等。
可以说命令模式是vim中最基础的模式。首先进入vim时默认的就是命令模式。而且想要切换到其它模式是必须在命令模式下进行的。下面就让我们来了解一下如何切换到其它模式。
首先在命令模式下按i、a或o是可以进入到插入模式的i是从当前光标下开始a是光标后移一个o是在下面另开一行。插入模式下就可以进行我们正常的写入了。在命令模式下按 shift; 也就是打出冒号 : 就可以进入到底行模式。vim的一些操作比如退出就是需要在低行模式下进行的。 按 Ctrlv 是进入视图模式v是大小写都可以其中在视图模式下按shifti、a、o等是在视图模式下进入插入模式视图模式下可以批量对文本进行操作。输入大写的R即shiftr是进入到替换模式。替换模式下每次输入的字符都会替换掉光标所在位置的字符。而对于任何模式下回到命令模式的情况都是只需要按键盘左上角的Esc即可。 常用操作
0、进入vim
# 直接启动vim
vim # 打开单个文件
vim file# 同时打开多个文件
vim file1 file2 file3 ...
1、进入到插入模式 i 在当前位置生前插入 I 在当前行首插入 a 在当前位置后插入 A 在当前行尾插入 o 在当前行之后插入一行 O 在当前行之前插入一行 s 删除当前字符并进入插入模式 S 删除当前行并进入插入模式 2、光标的移动 h 左移一个字符nh 左移n个字符 j 下移一个字符nj 下移n个字符k 上移一个字符nk 上移n个字符l 右移一个字符nl 右移n个字符 上面的这四个hjkl就对应着键盘右侧的 ←↓↑→ 方向键。 gg / [[ 移动到文件头G(shift g) / ]] 移动到文件尾 nG 移动到第n行 :n 移动到第n行 0 数字0移动到本行第一个字符上 功能键HOME 移动到本行第一个字符同0健。 ^ (shitf6) 移动到本行第一个非空白字符上$ (shitf4) / 功能键END 移动到行尾 n$ 移动到下面n行的行尾 (n)w 向后移动1(n)个单词光标停在单词首部如果已到行尾则转至下一行行首。 (n)b 向前移动1(n)个单词光标停在单词首部 (n)e 同w只是光标停在单词尾部 (n)ge 同b只是光标停在单词尾部 (n)fx 找到当前行光标后的第1(n)个为x的字符 (n)F 同f只不过是反向查找。 Ctrl e 向下滚动一行 Ctrl y 向上滚动一行 Ctrl d 向下滚动半屏 Ctrl u 向上滚动半屏 Ctrl f 向下滚动一屏 Ctrl b 向上滚动一屏 3、复制、剪切和粘贴 yiw 复制yank当前单词 yw 复制从当前光标的位置到下一个单词的开头 yb 复制从当前光标的位置到上一个单词的末尾 yy 复制整行包括换行符 4yy 复制4行包括换行符 y$ 复制从当前光标的位置到行尾 (n)x 剪切光标处连续的1(n)个字符 (n)X 剪切当前字符的前1(n)个字符 (n)dl 剪切后1(n)个字符dlx (n)dh 剪切前1(n)个字符dhX (n)d 剪切当前行开始的1(n)行通常还需要再回车一次 (n)dd 剪切当前1(n)行 (n)dj 剪切上1(n)行 (n)dk 剪切下1(n)行 (n)d$ 剪切1(n)行当前字符之后的所有字符 (n)d^ 剪切从光标到当前1(n)行的开头 (n)D 剪切当前字符至行尾Dd$ dG 从光标删除到文件尾 (d 是删除行, G 是文件尾, 连起来就是从光标行删除到文件尾) :beg,nd 剪切beg至n行最后的d是指令部分 :beg,$d 剪切beg行至以后所有的行 p 小写粘贴在光标之后P 大写粘贴在光标之前 4、替换操作 substitute命令将指定字符串替换为目标字符串。通常我们一般一般使用的是命令的缩写形式:s具体使用格式如下 :[range] s/search/replace/[flags] [count] 如果我们想要将所有出现的字符都替换成给定字符可以在命令中使用gglobal标记例如 :s/from/to/g 如果没有在命令中指定范围那么默认范围是当前行。范围指定的用法示例如下 # 在第10行知第20行每行前面加四个空格
:10,20 s/^/ /g # 把当前行中的I替换为We。命令中的i标记是用于指定区分大小写的。
:s/I/We/gi# 将文中所有的字符串idiots替换成managers
:1,$s/idiots/manages/g#通常我们会在命令中使用%指代整个文件做为替换范围
:%s/search/replace/g# 在第5至第15行间进行替换
:5,15s/dog/cat/g# 只在当前行在内的以下4行内进行替换
:s/helo/hello/g4# 只在当前行至文件结尾间进行替换
:.,$s/dog/cat/g# 只在后续9行内进行替换
:.,.8s/dog/cat/g 参考VIM学习笔记 替换(Substitute) - 知乎 (zhihu.com) s/old/new/ 用old替换new替换当前行的第一个匹配 s/old/new/g 用old替换new替换当前行的所有匹配 %s/old/new/ 用old替换new替换所有行的第一个匹配 %s/old/new/g 用old替换new替换整个文件的所有匹配 (n)ra 光标之后的1(n)个字符替换为ar是命令a是具体的字符R 从光标所在处开始替换字符按 esc 键结束。也就是replace模 (n)~ 也就是shiftEsc下面将从光标位置之后的1(n)个字符转换大小写 5、文件操作 :w 保存不退出 :q 不保存退出 :wq 保存退出 :q! 强制不保存退出不保存数据 :wq! 强制保存退出 :open file 在新窗口中打开文件 :split file 切换到下一个文件 :bn 切换到上一个文件 :bp 切换到上一个文件 6、多窗口操作
在底行模式下可以以多窗口的方式打开一个新文件具体操作形式如下 :sp file 以纵向显示的方式打开file文件 :vsp file 以横向向显示的方式打开file文件 :vs file 以横向显示的方式打开file文件 在多窗口模式的常用操作如下
命令关键词联想功能Ctrl w wwindow切换到下一个窗口。Ctrl w h/←window切换到左边的窗口。Ctrl w j/↓window切换到下边的窗口。Ctrl w k/↑window切换到上边的窗口。Ctrl w l/→window切换到右边的窗口。Ctrl w rreverse互换窗口。Ctrl w cclose关闭当前窗口。但是不能关闭最后一个窗口Ctrl w qquit退出当前窗口。如果是最后一个窗口则关闭vim编辑器Ctrl w oother关闭其他窗口
7、常用的set命令
:set number 显示行号
:set nu 显示行号
:set nonumber 关闭行号:set showcmd 显示输入的命令
:set noshowcmd 不显示输入的命令:set tabstop4 设置 tab space 为4个空格
:set ts4 同 tabstop
:set expandtab 将tab替换为指定数量的空格
:set autoindent 设置为自动缩进:set backgrounddark 设置背景颜色
:set guifontconsolas:h14 设置字体为 consolas字号为14:set history700 设置保存命令的行数:set autoread 设置当文件变化时自动读取新文件:set wrap 启动折行
:set nowrap 禁止折行 切换文件格式ff是 fileformat 的缩写
:set ffunix 将文件切换为 unix 格式每行以 \n 结尾
:set ffdos 切换为 Windows 格式每行以 \r\n 结尾 设置编码格式
:set encodingutf-8 设置 vim 展示文本时的编码格式
:set fileencodingutf-8 设置 vim 写入文件时的编码格式:set filetypehtml 设定文件类型方便语法高亮:set hlsearch 高亮显示搜索结果:set paste 设置为 paste 模式在粘贴前设置该模式可以避免各种 auto-formating
:set nopaste 切换回 normal 模式其它操作 :! command 在不退出vim的情况下执行command指令. 重复前一次命令u 撤销ctrl r 反撤销一个小技巧vim退出时的光标在哪进去时的光标就在哪 插件和配置
.vimrc文件
vim通常是用.vimrc文件配置的其实原理很简单就是.vimrc文件会在进入vim之前执行.vimrc文件中的所有指令所以我们通常把一些set命令放入到.vimrc文件中这样就不用每次进入vim时手动的输入指令来个性化我们的vim了。
插件
首先我们需要知道如果想要很好的使用vim中的插件一个很重要的工具就是插件管理器一般来说最常使用的插件管理器就是vim-plug。不过由于vim的插件种类繁多没有办法让我们快速上手所以我们可以尝试去GitHub上找一个一键部署的比如GitHub - askunix/VimForCpp: VIM一键配置C/C开发环境可自动下载各类插件。VIM一键配置C/C开发环境可自动下载各类插件。. Contribute to askunix/VimForCpp development by creating an account on GitHub.https://github.com/askunix/VimForCpp
如果要手动安装插件的话可以参考这篇博客神级编辑器 Vim 使用 - 插件篇 | 闪耀旅途 (hanleylee.com)https://www.hanleylee.com/articles/usage-of-vim-editor-plugin/
gcc/g
前置知识源文件形成可执行文件需要经过预处理、编译、汇编和链接这四大过程。不知道的可以看这篇博客浅析编译和链接 概念理解
gcc 与 g 分别是 gnu 的 c c 编译器 gcc/g 在执行编译工作的时候总共需要4步 1、预处理,生成 .i 的文件[预处理器cpp] 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs] 3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as] 4、连接目标代码, 生成可执行程序 [链接器ld] 参数说明
g和gcc的使用参数是一样的所以虽然以gcc的角度进行讲解但g也是同样使用的。gcc的多样性大多是源于它的参数其中有5个比较常用的参数Esco和std下面是相关解释 -E 只运行 C 预编译器把源文件编译为.i文件。 -S 只激活预处理和编译把文件编译成为汇编代码.s文件。 -c 只编译生成.o可重定位目标文件。 -o FILE 生成指定的输出文件FILE也就是说-o后面是必须跟文件名的。 -stdStandard 用于指定编译器的执行标准比如C99或者C11就需要手动指定。 当然还有一个 -g 选项也是比较常用的这是在需要调试代码时常用的一个选项。
gcc/g 命令的常用选项
-ansi 只支持ANSI标准的C语法。这一选项将禁止GNU C的某些特色例如asm或typeof关键词。
-c 只编译生成.o可重定位目标文件。
-DMACRO 以字符串1定义 MACRO 宏。
-DMACRODEFN 以字符串DEFN定义 MACRO 宏。
-E 只运行 C 预编译器把源文件编译为.i文件。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
-m486 针对 486 进行代码优化。
-o FILE 生成指定的输出文件。用在生成可执行文件时。
-O0 不进行优化处理。
-O 或 -O1 优化生成代码。
-O2 进一步优化。
-O3 比 -O2 更进一步优化包括 inline 函数。
-S 只激活预处理和编译把文件编译成为汇编代码.s文件。
-static 将禁止使用动态库即只使用静态库。
-stdStandard 用于指定编译器的执行标准比如C99或者C11就需要手动指定。
-share 尽量使用动态库。
-shared 生成共享目标文件。通常用在建立共享库时。
-UMACRO 取消对 MACRO 宏的定义。
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
gdb
使用过VS的人都知道在VS中编译一个程序时有debug和release版本。而在Linux中的gcc下默认生成的就是release版本的也就是说gcc/g默认生成的可执行程序是没有调试信息的当然也就不能调试如果想要生成可调式的需要在gcc/g的选项上再加一个-g。如果没有-g选项生成的可执行文件是没有调试信息的那么就会显示
由于gdb的使用非常的复杂东西很多所以这里我们只是简单的介绍如何快速上手用起gdb至于详细的内容可以参考gdb手册Help (Debugging with GDB) (sourceware.org)https://sourceware.org/gdb/onlinedocs/gdb/Help.html#index-GDB-version-number
当然由于这个手册是纯英文的所以可能很难入手如果很介意英文可以尝试在下面这篇博客里找里面的内容相对来说也是比较全面的
显示gdb版本信息 | 100个gdb小技巧 (gitbooks.io)https://wizardforcel.gitbooks.io/100-gdb-tips/content/show-version.html 下面是一些基础常用的gdb命令介绍以便我们能够快速上手。 list(l) 显示文件的源代码从当前函数开始每次显示10行按回车键继续。其中list是全称l是简写。list(l) line显示文件源代码从第line行开始。其余内容同上。list(l) func显示文件源代码从func函数开始。其余内容同上。run(r)运行程序通常配合断点来使用。和VS中不同的是gdb运行程序结束之后只要gdb没有退出就还可以继续用的。其中run是全称r是简写。startstart和run的功能基本上一致。最大区别的就是run命令是在第一个断点处停下start是在main函数的的入口处停下。break(b) line在第line行设置断点。break(b) func在func的函数入口处设置断点。break(b) file:line给file文件的line行打断点。break(b) file:func给file文件的func函数入口处打断点。info break(b)查看所有断点的信息。从gdb的打开到gdb的退出这之间断点的编号会一直增加即使某个断点被删除了它的编号也不会被占用。当gdb退出时所有的断点就会被全部清除。info break(b) n查看指定编号为n的断点。next(n)单条执行不会进入到语句的函数中相当于VS中的逐过程执行F10。通常在程序运行时配合断点使用。step(s)和next功能类似只是step会进入到当前语句的函数中更详细。相当于VS的逐语句执行F11。通常在程序运行时配合断点使用。continue(c)直接跳转到下一个断点处没有断点则直接执行至程序结束。until line无视任何条件直接跳转至line行。finish略过所有断点直接执行剩下的所有语句正常的结束当前函数。return立即结束停止执行当前函数并指函数的定返回值delete breakpoints(d)删除所有断点。delete breakpoints(d) n删除编号为n的断点。disable breakpoints(disable)禁用所有断点。disable breakpoints(disable) n禁用编号为n的断点。enable breakpoints(enable)启用所有断点。enable breakpoints(enable) n启用编号为n的断点。p val打印一次val变量的值但只显示一次。display val跟踪变量val。每次输入命令之后都会紧接着显示变量val的值。info display显示所有跟踪变量的信息。undisplay取消对所有变量的跟踪。undisplay n取消对编号为n的变量的跟踪。disable display n禁用对所有编号为n的变量跟踪。set variable/var val x将变量val的值改为x一般用于特殊情况的测试不过有一定的风险性而且一般不常用。breaktrace(bt)查看各级函数调用及参数可以类比VS中的查看调用栈帧。quit(q)退出gdb 其它 有时我们打开gdb时会显示一些提示信息感觉很冗余如果想要不显示可以在使用gdb时加上一个 -q 参数如果不输入任何东西直接回车默认是执行上一次的命令 make / makefile
作用介绍及语法格式
一般情况下。如果只用gcc/g编译源文件的话会很麻烦。首先重复性的输入近乎相同的指令是一个很繁杂的工作而且还会有一定的出错概率。其次如果文件很多很大的话那么对应的工作量也是会非常大的。所以综合考虑就比较适合使用make和Makefile用于日常开发。下面就让我们简单的快速了解一下make和Makefile以快速上手。
首先make是一个指令Makefile是一个文件。Makefile是我们自己手动创建并写入的而且文件名必须为makefile、Makefile或者GNUmakefile只能是这三个之一其中前两个是最为常用的。原因如下 默认的情况下make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件。在这三个文件名中最好使用“Makefile”这个文件名因为这个文件名第一个字符为大写这样有一种显目的感觉。最好不要用 “GNUmakefile”这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感但是基本上来说大多数的make都支持“makefile”和“Makefile”这两种默认文件名。 make命令就是执行Makefile文件中的内容make命令的用法格式如下
make #执行第一条方法
make target #执行具体的target方法#用法说明
# target是对应Makefile文件中的方法名
# 当没有指定具体的方法名时默认执行第一条方法
其中make命令有3个较为常用的参数 1-k 使用 -k 参数可以让 make 命令在发现错误时仍然继续执行而不是在检测到第一个错误时就停下来。利用这个选项可以在一次操作中发现所有未编译成功的源文件 2-n 使用 -n 参数让 make 命令输出将要执行的操作步骤而不是真正执行这些操作 3-f 使用 -f 参数后面可以接一个文件名用于指定一个文件作为 makefile 文件。如果没有使用 -f 选项则 make 命令会在当前目录下查找名为 makefile 的文件如果该文件不存在则查找名为 Makefile 的文件。 从宏观概念上讲Makefile里主要包含了五个东西 显式规则、隐晦规则、变量定义、文件指示和注释 显式规则显式规则说明了如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出要生成的文件文件的依赖文件生成的命令。隐晦规则由于我们的make有自动推导的功能所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile这是由make所支持的。变量的定义在Makefile中我们要定义一系列的变量变量一般都是字符串这个有点你C语言中的宏当Makefile被执行时其中的变量都会被扩展到相应的引用位置上。文件指示其包括了三个部分一个是在一个Makefile中引用另一个Makefile就像C语言中的include一样另一个是指根据某些情况指定Makefile中的有效部分就像C语言中的预编译#if一样还有就是定义一个多行的命令。注释Makefile中只有行注释和UNIX的Shell脚本一样其注释是用“#”字符这个就像C/C中的“//”一样。如果你要在你的Makefile中使用“#”字符可以用反斜框进行转义如“\#”。 而从使用层面上讲makefile文件有着固定的语法格式由一系列的“方法”组成而每一个“方法”都由依赖关系和依赖方法两部分组成“方法”的语法可以概括为如下格式
target:prerequisites
tabcommand1
tabcommand2
...#格式说明
# 注释是以#号开头一直延续到该行的结束。
# target是方法的名称一般就是编译器生成的文件名当然也可以不是
# prerequisites通常是依赖关系就是下面的命令会用到哪些文件
# command就是具体的依赖方法也就是make需要执行的命令它可以是任意的shell命令
# 一个强制性的规则是每一条依赖方法前必须有一个制表符tab
# 续行符反斜杠\以让所有的命令在逻辑上处于同一行 .PHONY伪目标
有一种特殊的方法叫做伪目标伪目标用.PHONY来定义伪目标的格式
.PHONY:name# .PHONY:是声明后面的name是具体的伪目标方法名
伪目标的作用 伪目标并不是实际存在的所以可以避免命令与目录下的文件名重复。伪目标可以没有依赖关系也就是说可以直接拿来用。伪目标可以保证依赖方法总是被执行的。.PHONY伪目标。凡是被.PHONY的依赖方法总是被执行就不会有“make不会执行没有修改过的文件”的效果。 make的自动推导功能
make很强大它可以自动推导文件以及文件依赖关系后面的命令。而且如果当前语句中出现了一个未定义的依赖关系make是会继续查看后面的内容的并顺便寻找这个未定义的依赖关系。
所以我们就没必要去在每一个[.o]文件后都写上类似的命令因为我们的make会自动识别并自己推导命令。只要make看到一个[.o]文件它就会自动的把[.c]文件加在依赖关系中如果make找到一个whatever.o那么 whatever.c就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来于是我们的makefile 再也不用写得这么复杂。例如
objects main.o kbd.o
cc gccedit : $(objects)$(cc) -o $ $^
%.o:%.c #这是Makefile的静态模式规则意思是所有的.o文件依赖于对应的.c文件.PHONY : clean
clean :rm edit $(objects)不会执行未改动的依赖方法
如果生成文件和方法名target是一样的话那么make就不会执行没有修改过的文件对应的方法。大致原理就是通过对比方法名target和依赖关系文件的时间戳来实现的。但是如果生成的文件和方法名target不一致的话就不会有此效果。所以大多数情况下为了防止大规模程序的多余编译行为我们一般默认就是把生成的文件名和方法名target保持一致。 两个特殊字符 - 和 : 1若在依赖关系的语句前加上了符号 -则表明将忽略该命令产生的所有错误 2若在依赖关系的语句前加上了符号 则表明不会将该命令显示在标准输出上 宏 /变量
宏也可以理解为变量定义的方法很简单格式如下
NAMEvalue# NAME是宏名变量名val是对应的值
# 这个值常用于为了简化写法而设置为依赖关系的文件名、生成的文件名、使用的编译器等名称
引用宏的方法是用$坐前缀然后将宏名用小括号或者大括号引起来格式如下
# 两种写法都可以
$(NAME) ${NAME}
使用宏定义可以让 makefile 文件的可移植性更强。除了自己定义一些宏以外make 命令还内置了一些特殊的宏定义使得 makefile 文件变得更加简洁 宏 说明$?当前目标所依赖的文件列表中比当前目标文件还要新的文件$当前目标的名字$当前依赖文件的名字$*不包括后缀名的当前依赖文件的名字
除了在 makefile 文件里面定义宏以外还可以调用 make 命令时在命令行上给出宏定义。命令行上的宏定义将覆盖在 makefile 文件中的宏定义。需要注意的是在 make 命令后接宏定义时宏定义必须以单个参数的形式传递因此尽量要避免在宏定义中使用空格或加引号。 文章转载自: http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn http://www.morning.jrpmf.cn.gov.cn.jrpmf.cn http://www.morning.rfwkn.cn.gov.cn.rfwkn.cn http://www.morning.jwcmq.cn.gov.cn.jwcmq.cn http://www.morning.bcnsl.cn.gov.cn.bcnsl.cn http://www.morning.zhoer.com.gov.cn.zhoer.com http://www.morning.nfpgc.cn.gov.cn.nfpgc.cn http://www.morning.kwyq.cn.gov.cn.kwyq.cn http://www.morning.trrrm.cn.gov.cn.trrrm.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.qjfkz.cn.gov.cn.qjfkz.cn http://www.morning.ydhck.cn.gov.cn.ydhck.cn http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn http://www.morning.tbnn.cn.gov.cn.tbnn.cn http://www.morning.zrbpx.cn.gov.cn.zrbpx.cn http://www.morning.ddrdt.cn.gov.cn.ddrdt.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.krwzy.cn.gov.cn.krwzy.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.xxwhz.cn.gov.cn.xxwhz.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.gmplp.cn.gov.cn.gmplp.cn http://www.morning.srwny.cn.gov.cn.srwny.cn http://www.morning.yjqkk.cn.gov.cn.yjqkk.cn http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn http://www.morning.qnzk.cn.gov.cn.qnzk.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn http://www.morning.nyfyq.cn.gov.cn.nyfyq.cn http://www.morning.nzfyx.cn.gov.cn.nzfyx.cn http://www.morning.kqzrt.cn.gov.cn.kqzrt.cn http://www.morning.ljglc.cn.gov.cn.ljglc.cn http://www.morning.bgxgq.cn.gov.cn.bgxgq.cn http://www.morning.lcxdm.cn.gov.cn.lcxdm.cn http://www.morning.qqnp.cn.gov.cn.qqnp.cn http://www.morning.qfplp.cn.gov.cn.qfplp.cn http://www.morning.dphmj.cn.gov.cn.dphmj.cn http://www.morning.rblqk.cn.gov.cn.rblqk.cn http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn http://www.morning.qbnfc.cn.gov.cn.qbnfc.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.qsmmq.cn.gov.cn.qsmmq.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.bpcf.cn.gov.cn.bpcf.cn http://www.morning.nmfxs.cn.gov.cn.nmfxs.cn http://www.morning.lbbrw.cn.gov.cn.lbbrw.cn http://www.morning.mdnnz.cn.gov.cn.mdnnz.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.tgbx.cn.gov.cn.tgbx.cn http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn http://www.morning.tjndb.cn.gov.cn.tjndb.cn http://www.morning.rxkl.cn.gov.cn.rxkl.cn http://www.morning.trfrl.cn.gov.cn.trfrl.cn http://www.morning.tnhmp.cn.gov.cn.tnhmp.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.xgxbr.cn.gov.cn.xgxbr.cn http://www.morning.wynnb.cn.gov.cn.wynnb.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.cbnxq.cn.gov.cn.cbnxq.cn http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.pflry.cn.gov.cn.pflry.cn http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn http://www.morning.ljcjc.cn.gov.cn.ljcjc.cn http://www.morning.jfsbs.cn.gov.cn.jfsbs.cn http://www.morning.fglxh.cn.gov.cn.fglxh.cn http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com http://www.morning.gccdr.cn.gov.cn.gccdr.cn http://www.morning.lsnhs.cn.gov.cn.lsnhs.cn http://www.morning.jtrqn.cn.gov.cn.jtrqn.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.piekr.com.gov.cn.piekr.com http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn http://www.morning.bkjhx.cn.gov.cn.bkjhx.cn http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn