Cpp 构建和编译笔记——3. gcc 选项
未分类选项 -o outfile: 指定编译的输出文件名称,缺省时默认为 a.out -std=c++11: 指定使用的 c++标准 优化相关 编译器的优化选项有 4 个级别 —O0: 默认情形,不进行优化(大写字母 O 后接数字 0) -O1 -O: 较低的优化级别,编译器会尝试减少空间大小和优化程序的执行时间,但不执行需要消耗大量编译时间的优化 -O2: 较高的优化级别,牺牲更多编译时间来提高程序的性能 -O3: 最高的优化级别,宁愿牺牲空间来提升程序的执行速度 -Og: 主要使用-O1优化, 除了那些影响调试的部分 -Os: 侧重于优化文件的体积 注意: 这里优化通常不是压缩可执行文件的大小,指的是优化运行速度等,优化得到的可执行文件体积可能还更大 优化的必然代价就是编译时间更长,执行逻辑与源代码不再逐行对应,难以调试,因此 debug 模式最好不要用高等级的优化 调试相关 -g: 在编译的时候,同时产生基本的调试信息 -ggdb: 尽可能的生成 gdb 的可以使用的调试信息。重复使用-g和-ggdb是无用的,从结果看,gcc 会忽略-g,使-ggdb生效 ...
Cpp 构建和编译笔记——2. 头文件和库
头文件 头文件的存在,目的是把接口和实现分离,便于多文件编程中的组织,比如 在多文件的项目中,把函数声明都集中到若干头文件中,在源文件中引用它们,便于跨文件的函数调用 在提供库的同时,我们也需要提供库的使用接口(头文件),通过头文件中的类和函数声明,用户可以知道如何使用这个库 在使用库的时候,首先需要在源代码中引用头文件,然后在链接步骤中链接需要的库文件 gcc 查找头文件 gcc 在编译过程中,预处理环节需要 include 相应的头文件,这里存在一个问题:如何找到头文件? gcc 存在专门的选项:-Ipath,也可以写成-I path,带不带空格都可以,但是只能后接一个路径,如果使用多个路径就需要多个-I,例如 1gcc hello.c -I mydir1 -I mydir2 如果直接写完整路径加文件名,那么不存在查找文件的问题,但是如果使用的是不完整路径加文件名,则存在查找顺序的问题。在 include 语句中,双引号和尖括号引用头文件的查找顺序有一点区别: 双引号 include 的查找顺序: 使用#include的源文件所在的路径 -I 指定的路径 环境变量CP...
Cpp 构建和编译笔记——1. 编译过程
打算开一个系列,写一些零零散散但自学了很久的东西——C/C++除了基本语法之外,还需要知道的东西——C++项目的编译与构建。 这一系列采用的编程环境为 Linux 系统,编译器为 gcc 11.2.0。(Windows 下的 mingw 作为两种平台间的畸形产物,曾经给我的学习造成了极大的困扰,尤其是静态库动态库部分) 如果使用 IDE 比如 VS 或 CLion 的话,这些东西可能都不需要了解,同样也可以写好 C++,但是我不喜欢使用 IDE 这种糊里糊涂,不清楚到底发生了什么的编程方式,更喜欢先搞懂每一步发生了什么,然后可以为了提高效率而使用 IDE,而非一直保持一种稀里糊涂的状态。 1. 编译过程的拆分 对于 c/c++编程,从源代码文件变成可执行文件,大致需要以下几步: 预处理(Pre-Processing),预处理器(preprocessor)处理#include #define等内容,把头文件 copy 到源文件中等,注意这种 include 是递归的,并且这里存在一个问题:gcc 如何找到头文件。 编译(Compiling),得到的文件是以汇编语言写的,可读。 汇...
Linux 几类重要命令
由于压缩解压、网络文件传输和定时任务都是实践中很常见的操作,这里进行更详细的命令介绍。 命令速查 解压缩并解包 1tar -xf archive.tar.(gz|bz2|xz) 解压缩并解包到指定位置 1tar -xf archive.tar.(gz|bz2|xz) -C /path/to/destination 打包并压缩 1tar -acf archive.tar.(gz|bz2|xz) file1 file2 directory zip 文件的解压 1unzip archive.zip -d tmp/ 压缩解压 zip zip和unzip命令用于创建和解压缩.zip格式的压缩文件。 压缩文件的基本使用如下:创建一个名为 archive.zip 的压缩文件,并包含了指定的文件。 1zip archive.zip file1 file2 需要注意的是,如果直接添加目录,那么只是添加了文件夹自身,不含其中的项!必须使用-r选项才能递归压缩整个目录 1zip -r archive.zip directory 混合添加文件和文件夹也需要使用-r选项 1zip -r archive.z...
Linux 常用命令
目录基础 切换目录 cd命令(change directory)用于改变目录: cd <path>:切换到<path>目录下,可以是相对路径或/开头的绝对路径; cd:缺省时会回到家目录~ cd .. 返回上一级目录 cd -可以回到上一次所处的位置 解释一下 Linux 中的路径表示规则: /开头的路径是绝对路径,表示从根目录开始,例如 /opt/xxx; 不以 / 开头的路径是相对路径,表示从当前目录开始,例如 a/b 特殊字符: . 表示当前目录 .. 表示上一级目录; ~ 表示当前用户的家目录,例如 /home/<username>。 注意:对于目录的表示,是否以 / 结尾的写法(例如 /opt 和 /opt/)在 cd 命令中没有区别,但是在某些命令中会存在区别,倾向于用前者指代目录自身,用后者指代目录中的内容。 查看目录 ls命令(list directory)用于列出目录下的文件,基本用法如下 ls <path>:列出目录下的所有文件 ls:缺省<path>则会列出当前目录下的文件 除此之外...
Linux 基础学习笔记
目录结构 各种 Linux 系统有着大致统一的标准目录结构:(FHS) / 根目录 可执行文件目录 /bin,/sbin 存放系统层面所必需的可执行文件,例如cp、ls等,其中/sbin存放的是需要root权限的部分 /usr/bin,/usr/sbin 存放用户层面的可执行文件,例如git、wget等 库目录 /lib 存放系统层面所必需的的动态库,理论上是为/bin和/sbin准备的,此外/lib/modules还存放内核模块 /usr/lib 存放用户层面的动态库,理论上是为/usr/bin和/usr/sbin准备的 除了lib,可能还有lib32,lib64,作用类似 /usr/local (重要)存放管理员安装的程序,与使用apt等命令直接安装的不同,这里通常存放的是手动编译安装的软件,这个目录很重要,下面单独讨论 用户家目录(重要) /root root 用户的家目录 /home 一般用户的家目录的父目录 /home/abc 名为 abc 的用户的家目录 /opt (重要)一般用于安装第三方提供的,可选的大型应用程序 /etc (重要)存放系统的配置...
web自学3——JavaScript
在简单学习了 HTML 和 CSS 之后,接下来是 JavaScript 的学习,学习的重点不是 JavaScript 作为一个脚本语言的语法内容,而是 JavaScript 对于网页的控制,参考教程:https://developer.mozilla.org。 HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为 1. 在 HTML 中使用 JS 在 HTML 和 CSS 一起组装成一个网页之后,浏览器的 JavaScript 引擎将执行 JavaScript 代码,这保证了当 JavaScript 开始运行之前,网页的结构和样式已经就位,然后 JS 可以更新这个网页的具体内容等。 对于浏览器,它的每一个标签页使用了一个独立的运行环境,不同标签页之间没有任何联系,JS 代码也相互独立运行,一定程度上保证了信息安全。 script 标签 在 HTML 的 head 或者 body 部分都可以使用,例如: 12345678910111213<!DOCTYPE html><html lang="en"&...
web自学2——CSS
在简单学习了 HTML 之后,我们可以得到一个简单的静态网页,但是为了让网页呈现更加丰富的样式,一个明智的做法把样式信息和文本信息分离开,文本信息对应 HTML,样式信息对应 CSS,完成一个网页的组织分离,接下来是 CSS 的简单学习,参考教程:https://developer.mozilla.org HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为 1. 在 HTML 中使用样式 我们最终的目标是把 CSS 文件和 HTML 文件结合起来,但是在此之前,还有一些方法可以直接在 HTML 文件中使用简单的样式: style 属性 例如添加背景色 background-color, 可以直接使用元素的style属性定义的样式 源代码如下: 1<p style="background-color: #00BFFF">可以直接使用元素的style属性定义的样式</p> 嵌入 CSS 语句 我们使用如下简单的 html 文件,在头部使用<style type="text/css"&g...
web自学1——HTML
众所周知,web 前端主要包括 HTML+CSS+JavaScript 三部分组成,其中 HTML 是超文本标记语言,CSS 是层叠样式表,JavaScript 是脚本语言。 以下学习的内容都是静态网页而非动态网页,不涉及服务器数据库之类的知识,目标之一是了解最基本的网页知识,例如可以写出几个简单的静态网页,并且利用 Hexo+Github Pages 部署,目的之二是看懂 Hexo 搭建博客的样式配置等。参考教程:https://developer.mozilla.org HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 控制了网页的行为 1. 元素 一个典型的 html 元素如下: 1<p class="note">content</p> 其中<p>是开始标签,</p>是结束标签,中间的content是元素的内容,class="note"是标签的属性。 上述元素是成对的,包括开始标签和结束标签,元素可以相互嵌套,例如 1<p>My cat is <strong&...
Cpp MPI学习笔记
本文是关于并行计算的学习,根据具体的实现方式不同,并行计算主要考虑两类方式: 以 MPI 为代表的多进程,不共享内存,进程之间通过消息传递机制进行通信; 以 OpenMP 为代表的多线程,共享内存; 本文主要针对的是 MPI,使用 C++ 接口。后续还可能有关于 OpenMP 和专门的 C++ 多线程库std::thread的学习。 多进程与多线程 对于系统而言,进程是资源分配的最小单位,直接点击可执行文件一般就会开启一个进程,执行当前的应用程序,分配独立的内存空间供其使用;线程是 CPU 调度的最小单位,线程必须隶属于进程而存在,一个进程默认拥有一个线程,也可以拥有多个线程,线程之间需要共享同一个内存空间。 对于多进程的直观理解,可以类比微信多开;对于多线程的理解,例如一个带 GUI 的科学计算器程序,至少拥有两个线程,其中一个线程处于等待状态,负责接收用户的界面操作信息,给出直观的反馈,另一个线程负责执行耗时的计算,防止计算任务对整个程序的运行造成阻塞。(如果只有一个线程,则执行耗时的计算过程中,图形界面就一直是卡死的状态) 多进程的编程中,关键是如何相互传递消息,因为...