GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器
编译一个简单的.c程序:
四步分开写:
gcc -E -o hello.i hello.c // 预处理
gcc -S -o hello.s hello.i // 编译
gcc -c -o hello.o hello.s // 汇编
gcc -o hello hello.o // 链接
分成两步:
gcc -c -o hello.o hello.c // 先编译(做了前三步,但不链接)
gcc -o hello hello.o // 再链接
一步到位:(这个hello就是可执行文件,存放程序结果)
gcc -o hello hello.c
一下编译多个源文件
gcc -o hello a.c b.c c.c
gcc -o a.o a.c
gcc -o b.o b.c
gcc -o c.o c.c
gcc -o hello a.o b.o c.o
gcc -o hello hello.c这种一步到位的方法会将文本文件直接转化成可执行文件,这样的做法会比将源代码分别经过预处理,编译,汇编,链接这四个过程的效率要更高,
这是因为在一次编译过程中,gcc -o output file.c会自动执行预处理、编译、汇编和链接这四个步骤,它能够根据需要自动调用相应的工具。这样可以避免中间文件的生成和保存,减少了磁盘I/O的开销,并减少了编译过程中的文件传输时间。
然而,如果你在多次编译中需要重复使用预处理文件、汇编文件或目标文件,或者需要手动进行编译的不同阶段的调试或优化,那么将源代码分别经过预处理、编译、汇编和链接四个步骤可能会更加灵活和方便。
总的来说,对于一次性的编译过程而言,直接使用gcc -o output file.c的方式更高效。而对于多次编译、调试或优化的情况,分阶段进行编译可能更为灵活。在实际使用中,可以根据具体需求和优化目标选择合适的编译方式。
如果说需要编译C++程序的话,就把gcc改成g++即可
g++ -o hello hello.c
GDB是一个功能强大的调试工具,用于调试C、C++等程序
接下来讲一个简单的调试例子,并给出常用的命令:
1.先用GCC命令生成调试信息
在g++/gcc 后面加上 -g表示生成调试信息
g++ -g -o hello hello.cpp
如果不生成的话,会弹出错误
“NO symbol table is loaded”
意味着在您加载的可执行文件中没有找到符号表。符号表包含了程序中变量、函数和其他符号的信息,它是调试器进行源代码和机器码之间映射的关键。
2.使用gdb命令进行调试
gdb的常见命令:
1.使用gdb
gdb myprogram(文件名)
2.设置断点
break
location可以是一个函数,或者是一个源文件加行号的形式,例如:
break main
break hello.cpp:5
3.运行程序
run
4.继续运行程序(在一个断点停下之后)
continue
遇到下一个断点会停下
5.单步执行(不进入函数)
next
6.单步执行(进入函数)
step
7.打印变量的值
print 变量名
8.查看堆栈
backtrace
9.监视变量
watch 变量名
监视变量的值,当该变量的值发生变化时,GDB会中断程序的执行。
10.修改变量的值
set 变量名 = 值
常用命令
接下来给出一个实例:
1.写一个待测试程序hello.cpp,如图
2.用g++ 命令生成可执行文件
3.使用gdb命令开始调试
4.设置断点
如图,我在程序第6行设置了一个断点,第六行的代码此时为
printf(“%d”,sum);也就是说程序运行到这行之前就停止了
4.使用run命令运行程序
如图,程序运行到第六行发现有一个断点,停止了运行,并给出了提示.
5.用print打印变量
会发现x和y的值是正常的,但是因为sum=x+y这条命令没执行,所以sum的值是没初始化的
6.单步执行程序
我们单步执行下一行语句 sum=x+y之后,再用print打印 sum的值
sum的值变成了15
7.继续运行程序
因为后续没有断点了,所以程序会直接运行到结束,并输出结果.
这些都只是Linux操作系统的一些基本操作
接下来我们说一下如何编写一个简单的shell脚本
1.创建一个.sh后缀的文件
vim create_project.sh
写入:
#!/bin/bash
echo "hello shell"
mkdir my_project
cd my_project
cd ..
mkdir build
touch main.cpp
其中
#!/bin/bash
是告诉操作系统使用Bash解释器来解释和执行后续的Shell脚本代码。Bash(Bourne Again SHell)是一种流行的Unix/Linux Shell,它提供了强大的命令行解释器和脚本编程功能。
使用#!/bin/bash作为shebang行的好处是,它确保脚本在执行时将使用Bash解释器,而不依赖于默认的Shell解释器。这样,您可以确保脚本中使用的特定Bash语法和功能在执行时可用。
除了#!/bin/bash,您还可以使用其他Shell解释器作为shebang行的一部分,例如#!/bin/sh表示使用标准Shell解释器,或#!/bin/zsh表示使用Zsh解释器。根据您的需求和系统配置,选择适合的解释器。
2.设置权限为可运行
chmod +x create_project.sh
3.运行脚本
./create_project.sh
或者
bash create_project.sh
运行之后,系统就会依次执行shell脚本中的命令.
功能:
(1) 命令行模式下的文本编辑器。
(2) 根据文件扩展名自动判别编程语言。支持代码缩进、代码高亮等功能。
(3) 使用方式:vim filename
如果已有该文件,则打开它。
如果没有该文件,则打开个一个新的文件,并命名为filename
模式:
(1) 一般命令模式
默认模式。命令输入方式:类似于打游戏放技能,按不同字符,即可进行不同操作。可以复制、粘贴、删除文本等。
(2) 编辑模式
在一般命令模式里按下i,会进入编辑模式。
按下ESC会退出编辑模式,返回到一般命令模式。
(3) 命令行模式
在一般命令模式里按下:/?三个字母中的任意一个,会进入命令行模式。命令行在最下面。
可以查找、替换、保存、退出、配置编辑器等。
操作:
(1) i:进入编辑模式
(2) ESC:进入一般命令模式
(3) h 或 左箭头键:光标向左移动一个字符
(4) j 或 向下箭头:光标向下移动一个字符
(5) k 或 向上箭头:光标向上移动一个字符
(6) l 或 向右箭头:光标向右移动一个字符
(7) n:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
(8) 0 或 功能键[Home]:光标移动到本行开头
(9) $ 或 功能键[End]:光标移动到本行末尾
(10) G:光标移动到最后一行
(11) :n 或 nG:n为数字,光标移动到第n行
(12) gg:光标移动到第一行,相当于1G
(13) n:n为数字,光标向下移动n行
(14) /word:向光标之下寻找第一个值为word的字符串。
(15) ?word:向光标之上寻找第一个值为word的字符串。
(16) n:重复前一个查找操作
(17) N:反向重复前一个查找操作
(18) :n1,n2s/word1/word2/g:n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2
(19) :1, s / w o r d 1 / w o r d 2 / g :将全文的 w o r d 1 替换为 w o r d 2 ( 20 ) : 1 , s/word1/word2/g:将全文的word1替换为word2 (20) :1, s/word1/word2/g:将全文的word1替换为word2(20):1,s/word1/word2/gc:将全文的word1替换为word2,且在替换前要求用户确认。
(21) v:选中文本
(22) d:删除选中的文本
(23) dd: 删除当前行
(24) y:复制选中的文本
(25) yy: 复制当前行
(26) p: 将复制的数据在光标的下一行/下一个位置粘贴
(27) u:撤销
(28) Ctrl + r:取消撤销
(29) 大于号 >:将选中的文本整体向右缩进一次
(30) 小于号 <:将选中的文本整体向左缩进一次
(31) :w 保存
(32) :w! 强制保存
(33) :q 退出
(34) :q! 强制退出
(35) :wq 保存并退出
(36) :set paste 设置成粘贴模式,取消代码自动缩进
(37) :set nopaste 取消粘贴模式,开启代码自动缩进
(38) :set nu 显示行号
(39) :set nonu 隐藏行号
(40) gg=G:将全文代码格式化
(41) :noh 关闭查找关键词高亮
(42) Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
异常处理:
每次用vim编辑文件时,会自动创建一个.filename.swp的临时文件。
如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
(1) 找到正在打开该文件的程序,并退出
(2) 直接删掉该swp文件即可
以二进制模式打开文件:
vim -b 文件名
这里面的命令都有各种形式的变化,比如当我们使用复制命令:y时
:1,2y 表示复制 1-2行的内容
我们还可以使用可视模式
将光标移动到要复制的起始位置。
按下 v 进入普通可视模式。
使用方向键或 hjkl 键选择要复制的部分。
按下 y 复制选中的部分。
按下 p 将复制的内容粘贴到光标位置之后。