开发环境与工具
目录
*Linux 操作系统
- 全称 GNU/Linux,是一种免费使用和自由传播的类 UNIX 操作系统,其内核由林纳斯·本纳第克特·托瓦兹于 1991 年 10 月 5 日首次发布
- 主要受到 Minix 和 Unix 思想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统
- 能运行主要的 Unix 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件,是性能稳定的多用户网络操作系统
- 发行版本包括 Debian、 Ubuntu、 RHEL、 Centos、 Slackware 等
*Unix 操作系统
- 是分时操作系统,最早于 1970 年问世
- 1972 年,Dennis Ritchie 开发出了 C 语言,用来改写原来用汇编语言编写的 UNIX
- 提供了良好的用户界面,文件系统是树形结构
- 把文件、文件目录和设备统一处理
- 包含有非常丰富的语言处理程序、实用程序和开发软件用的工具性软件
- 还提供利进程间的简单通信功能
Linux 常用命令
命令 | 说明 |
---|---|
export | 查看、设置环境变量 |
top | 查看进程情况 |
kill | 结束(停止)进程 |
find | 根据文件名中的字段查找文件 |
grep | 找出若干文件中符合规则的内容 |
sed | 替换若干文件中符合规则的字段 |
ulimit | 查看、设置资源最大调度 |
diff | 对比文件之间的异同 |
which | 查看一个命令所在的目录路径 |
vi | 编辑 ASCII 码文件 |
export 命令与环境变量
- 环境变量一般指操作系统中指定运行环境的公共参数,即系统预定义的参数。要查看环境变量值时,需加上“$”
- 例(显示某个环境变量):
echo $PATH
- 例(显示某个环境变量):
- 环境变量可以有多个值,存在先后顺序(离等号越近的优先级越高),值之间用冒号(“:”)隔开
- 显示所有环境变量的命令:
export
- 修改环境变量的命令:
export LD_LIBRARY_PATH=/opt/netCDF-intel15-withhdf5/lib:$LD_LIBRARY_PATH
- 用
man export
命令获取export
命令的使用说明
环境变量
较为重要的环境变量 | 说明 |
---|---|
PATH | 操作系统命令或可执行文件的路径 |
LIBRARY_PATH | 静态链接库的路径 |
LD_LIBRARY_PATH | 动态链接库的路径 |
共性特点:当上述环境变量有多个值(路径)时。对可执行文件和链接库的匹配按照从左到右
- 通过 ~/.bashrc 和 ~/.bash_profile 文件在登录时自动加载环境变量
- ~/.bashrc 或 ~/.bash_profile 文件加入直接设置环境变量的 export 命令,或通过 source 命令设置环境变量
Linux 下的脚本文件
- Shell 脚本文件
- 把各类命令预先放入一个文件中,方便一次性执行多个命令
- 用于批处理或者工作流控制,也可用于设置环境变量
- 常用格式包括 bash 脚本、csh 脚本、perl 脚本、 ruby 脚本等
ulimit 命令
ulimit -a
命令:显示各种资源的最大限度ulimit -s unlimited
:将栈的最大大小设置为无限
编辑器 vi
Vi 编辑器
- vi 和 vim( vi 的增强版本)是 Linux 中最常用的编辑器
- 一款由加州大学伯克利分校 Bill Joy 研究开发的文本编辑器
- 只能编辑字符,不能对字体、段落进行排版;既可以新建文件,也可以编辑文件;没有菜单,只有命令,且命令繁多
- 三种工作模式
- 命令模式: 启动 vi 后即进入命令模式,并可转换为文本编辑模式和最后行模式。在命令模式下,从键盘上输入的任何字符都被当作编辑命令来解释,而不会在屏幕上显示。如果输入的字符是合法的 vi 命令,则 vi 就会完成相应的动作;否则 vi 会响铃警告。
- 文本编辑模式: 用于字符编辑。在命令模式下输入
i
(插入命令)、a
(附加命令)等命令后进入文本编辑模式,此时输入的任何字符都被 vi 当作文件内容显示在屏幕上。按Esc
键可从文本编辑模式返回到命令模式。 - 最后行模式:在命令模式下,按 “:” 键进入最后行模式,此时 vi 会在屏幕的底部显示 “:” 符号年作为最后行模式的提示符,等待用户输入相关命令。命令执行完毕后,vi 自动回到命令模式。
- 其他:
- 搜索字段: “/string”,“/string\c”,“n”
- 替换字段: “:%s/string1/string2/g”
- 撤销操作:在命令模式下敲击命令
u
- 复制粘贴操作
- 拷贝:在命令模式下敲下
v
后选出被复制区域,然后敲下y
进行复制 - 黏贴: 在命令模式下,找到适当位置后敲下
p
- 拷贝:在命令模式下敲下
Vi 编辑器常用命令
命令 | 说明 |
---|---|
ctrl + b/u | 向上移动一屏/半屏 |
ctrl + f/d | 向下移动一屏/半屏 |
i | 在光标之前插入 |
a | 在光标之后插入 |
dw | 删除一个单词 |
dd | 删除一行 |
d | 删除光标到行尾的内容 |
:w | 保存 |
:wq! | 保存退出 |
:q! | 不保存退出 |
G | 到文件最后一行 |
ctrl+g | 显示文件名(含路径)和文件行数 |
Linux 下编译器的使用
编译器
- 将一种编程语言(通常为高级语言)翻译为另一种语言(通常为低级语言)的程序
- 主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程 序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
- 包括词法分析、语法分析、语义分析、中间代码生成、中间代码优化、后端代码优化、代码生成等步骤
- 有众多编译选项供选择使用
- GNU、LLVM、Open64 等开源编译器;Intel 等商用编译器
Linux 下主要编译器
- gcc 编译器
- 由GNU开发的编程语言编译器套件,是以 GPL 许可证所发行的自由软件,包括 C、C++、ObjectiveC、Fortran、Java、Ada 和 Go 语言前端, 也包括了这些语言的库(如 libstdc++, libgcj 等)
- 最基本的用法:
gfortran [options] [filenames]
编译选项 | 说明 |
---|---|
-c | 只编译生成以 .o 为后缀的目标文件,不链接成为可执行文件 |
-o output_filename | 指定输出文件名(不能与源文件同名),默认名为 a.out |
-g | 产生符号调试工具(GNU 的 gdb)所必要的符号信息 |
-traceback | 产生函数栈的调用信息,使程序运行段错误时输出栈信息 |
-O0~3 | 编译器优化级别,级别越高,程序运行速度越快,但出错风险更高 |
-S | 编译生成汇编文件 |
-I/dir | 指定头文件、module 文件所在的目录 |
- Intel 编译器
- 由 Intel 公司研发的编程语言编译器套件,非开源软件,包括 C、C++、Fortran 等语言前端,也包括了这些语言的库
- 最基本的用法:
ifort [options] [filenames]
编译选项 | 说明 |
---|---|
-c | 只编译生成以 .o 为后缀的目标文件,不链接成为可执行文件 |
-o output_filename | 指定输出文件名(不能与源文件同名),默认名为 a.out |
-g | 产生符号调试工具(GNU 的 gdb)所必要的符号信息 |
-traceback | 产生函数栈的调用信息,使程序运行段错误时输出栈信息 |
-O0~3 | 编译器优化级别,级别越高,程序运行速度越快,但出错风险更高 |
-S | 编译生成汇编文件 |
-I/dir | 指定头文件、module 文件所在的目录 |
编译优化级别
- 通过不同编译优化级别,开启或关闭编译优化组合
-O0
:没有编译优化。生成没有优化过的二进制代码,所需编译时间最短,主要用于程序调试-O1
:有限优化,在影响到调试信息的地方不进行优化;编译时间不会增加太多-O2
:高度优化,在-O1
的基础上,尝试更多寄存器级优化与指令级优化;调试信息不友好,编译时间较长-O3
:在-O2
基础上增加了更加激进的优化,如函数内嵌和向量化等
编译优化选项
- Intel 编译器
- 用
ifort -help
命令查看编译优化选项 - 与浮点计算精度相关的编译选项包括
-fp-model
-fp-speculation
-mp1
-no-vec
-no-simd
- 用
- GNU 编译器
- 用
man gcc
和man gfortran
命令查看编译优化选项 - 与浮点计算精度相关的编译选项包括
-ffloat-store
-fno-unsafe-math-optimizations
-fnoassociative-math
-fno-reciprocal-math
-fno-finite-mathonly
-fno-rounding-math
-fno-cx-limited-range
- 用
Makefile
Makefile 中只允许 Tab 缩进,不允许空格缩进
- 为自动编译一组源文件提供制导信息的文件
makefile
# 指定编译器的编辑命令
CC := clang
# 指定可执行文件所依赖的二进制文件,及二进制文件编译的先后顺序
main: main.o func1.o func2.o
$(CC) -o $@ $^
# 指定二进制文件的编译规则。
# 任何.o文件都会遵照这个编译规则(当存在于 `.o` 文件名字相同的 `.c` 文件时)
.c.o:
$(CC) -c -o $@ $<
# 指定删除目标文件的规则
clean:
rm -f main *.o