Linux下C语言编程基础学习记录
VIM的基本使用







LINUX下C语言编程
用gcc命令编译运行C语言文件
预处理阶段:将*.c文件转化为*.i预处理过的C程序。
编译阶段:将*.i文件编译为汇编代码*.s文件。
汇编阶段:将*.s文件转化为*.o的二进制目标代码文件。
链接阶段:将*.o文件转化为可执行文件。
生成可执行文件:将*.o转换为可执行文件。
执行可执行C语言文件。

gcc常用选项列表
-c 只编译不链接,生成目标文件“.o”
-S 只编译不汇编,生成编码代码
-E 只进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息
-o file 将file文件指定为输出文件
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir 在头文件的搜索路径中添加dir目录
直接生成可执行文件
例:gcc –o hello hello.c
gcc –g –o p main.c swap.c (p为可执行文件)
静态库的创建
使用归档工具ar将一些目标文件集成在一起。

静态库的使用
编译主程序,它将会链接到刚生成的静态库libpow.a中

例2:
使用 AR工具创建静态库(课本p459)
gcc –c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o
创建可执行文件并执行

注意:创建头文件的格式:
//若头文件名为headrt.h
#ifndef HEADRT_H
#define HEADRT_H
内容...
#endif
gcc的警告和出错选项
|
选项 |
含义 |
|
-ansi |
支持符合ANSI标准的C程序 |
|
-pedantic |
允许发出ANSI C标准所列的全部警告信息 |
|
-pedantic-error |
允许发出ANSI C标准所列的全部错误信息 |
|
-w |
关闭所有警告 |
|
-Wall |
允许发出gcc提供的所有有用的报警信息 |
|
-werror |
把所有的警告信息转化为错误信息,并在警告发生时终止编译过程 |



gdb调试器的使用
gdb调试器是一款GNU开发组织发布的UNIX/Linux下的调试工具。
使用流程
先用gcc对test.c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。

使用gdb调试文件

在gdb中键入“l”(list)就可以查看所载入的文件,如下所示。
注意:在gdb的命令中都可以使用缩略形式的命令,如“l”代表“list”,“b”代表“breakpoint”,“p”代表“print”等,读者使用“help”命令查看帮助信息。

设置断点
只需在“b”后加入对应的行号即可。
查看断点情况
在设置完断点之后,用户可以键入“info b”来查看设置断点情况,在gdb中可以设置多个断点。

用户键入“backrace”(只输入“bt”即可)可以查到调用函数(堆栈)的情况。
运行代码
gdb默认从首行开始运行代码,键入“r“(run)即可(若想从程序中指定行开始运行,可在后面加上行号)。

(6) 查看变量值。
在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在gdb中键入“p”+变量值即可。

(7)单步运行。
单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。
(8)恢复程序运行。
在查看完所需变量及堆栈情况后,就可以使用命令“c“恢复程序的正常运行了。
这时它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。
(9)在gdb中可以使用help查看帮助。
(10)工作环境相关命令
|
命令格式 |
含义 |
|
set |
指定运行时参数,如set args 2 |
|
show |
查看设置好的运行参数 |
|
path |
设定程序的运行路径 |
|
show |
查看程序的运行路径 |
|
set |
设置环境变量 |
|
show |
查看环境变量 |
|
cd |
进入dir目录,相当于shell中的cd命令 |
|
pwd |
显示当前工作目录 |
|
shell |
运行shell中的command命令 |
(11)设置断点与恢复命令
|
命令格式 |
含义 |
|
Info |
查看所设断点 |
|
break[文件名:]行号或函数名<条件表达式> |
设置断点 |
|
tbreak[文件名:]行号或函数名<条件表达式> |
设置临时断点,到达后自动删除 |
|
delete[断点号] |
删除指定断点,其断点号为“info b“中的第一栏。若默认断点号则删除所有断点 |
|
disable[断点号] |
停止指定断点,使用“info b“仍能查看此断点。同delete一样,若默认则停止所有断点 |
|
enable[断点号] |
激活指定断点,即激活被disable停止的断点 |
|
condition[断点号]<条件表达式> |
修改对应断点的条件 |
|
ignore[断点号]<num> |
在程序执行中,忽略对应断点num次 |
|
Step |
单步恢复程序运行,且进入函数调用 |
|
Next |
单步恢复程序运行,且不进入函数调用 |
|
Finish |
运行程序,直到当前函数完成返回 |
|
C |
继续执行函数,直到函数结束或遇到新的断点 |
(12)gdb中源码查看相关命令
|
命令格式 |
含义 |
|
list<行号>|<函数名> |
查看指定位置代码 |
|
file[文件名] |
加载指定文件 |
|
forward-search |
源代码的前向搜索 |
|
reverse-search |
源代码的后向搜索 |
|
dir |
将路径DIR添加到源文件搜索的路径的开头 |
|
show |
显示源文件的当前搜索路径 |
|
info |
显示加载到gdb内存中的代码 |
(13)gdb中查看运行数据相关命令
|
命令格式 |
含义 |
|
print |
查看程序运行时对应表达式和变量的值 |
|
x<n/f/u> |
查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数 |
|
display |
设定在单步运行或其他情况中,自动显示的对应表达式的内容 |
|
backtrace |
查看当前栈的情况,即可以查到哪些被调用的函数尚未返回 |
(14)gdb中修改运行参数相关命令
gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set var 变量=设定值“。这样,在此之后,程序就会按照该设定的值运行了,或者是使用print命令修改。
例:“print key=value”


make工程管理器
makefile是make读入的唯一配置文件
在一个makefile中通常包含如下内容:
需要由make工具创建的目标体(target),通常是目标文件或可执行文件。
要创建的目标体所依赖的文件(dependency_file);
创建每个目标体时需要运行的命令(command),这一行必须以制表符(Tab键)开头。
格式:
target: dependency_files
command
例:makefile内容如下

命令行中执行的命令:

生成目标文件hello.o
makefile中常见得预定义变量

makefile中常见的自动变量

makefile中常见的隐式规则目录

make的命令行
|
命令格式 |
含义 |
|
-C dir |
读入指定目录下的makefile |
|
-f file |
读入当前目录下的file文件作为makefile |
|
-i |
忽略所有的命令执行错误 |
|
-I dir |
指定被包含的makefile所有目录 |
|
-n |
只打印要执行的命令,但不执行这些命令 |
|
-p |
显示make变量数据库和隐含规则 |
|
-s |
在执行命令时不显示命令 |
|
-w |
如果make在执行过程中改变目录,则打印当前目录名 |
动态链接共享库
共享库是致力于解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行时,可以加载到任意的存储器地址,并和一个存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接器的程序来执行。
共享库也称为共享目标,在Unix系统中通常用.so后缀来表示。微软的操作系统大量地利用了共享库,它们称为DLL(动态链接库)。
创建共享库
链接到程序中
作业
将实验楼中的代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;
编写makefile,让代码编译,上述静态库和共享库的使用自动化
建立函数静态库cal1.a:

将静态库cal1.a链接到main.o中并生成执行文件cal1并执行

建立函数动态库cal2.so

将静态库cal2.a链接到main.o中并生成执行文件cal2并执行

建立静态库的makefile文件

运行make管理器生成cal3执行文件并执行

建立动态库makefile文件

运行make管理器生成cal4执行文件并执行

遇到的问题
在gdb中执行单步调试中使用set修改变量值时出现如下提示,修改失败。

解决方法
向老师请教
教材有错,正确的格式应为:
set var 变量名=修改值
或
print 变量名=修改值


Linux下C语言编程基础学习记录的更多相关文章
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- 【转】Linux基础与Linux下C语言编程基础
原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...
- 实验二 Linux下C语言编程基础
1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- LINUX下C语言编程调用函数、链接头文件以及库文件
LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...
- Linux下C语言编程中库的使用
零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
- linux下C语言编程,include的默认搜索路径
C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include<头文件名>和include"头文件名" 如:incl ...
随机推荐
- 阿里八八Alpha阶段Scrum(6/12)
今日进度 叶文滔: 修复了无法正确判断拖曳与点击的BUG,并且成功连接添加界面. 会议内容 会议照片 明日安排 叶文滔: 继续完善按钮功能 王国超: 继续攻克日程界面显示存在的BUG 俞鋆: 继续进行 ...
- PyQt5--MenuBar
# -*- coding:utf-8 -*- ''' Created on Sep 13, 2018 @author: SaShuangYiBing ''' import sys from PyQt5 ...
- 基于汇编的 C/C++ 协程 - 背景知识
近几年来,协程在 C/C++ 服务器中的解决方案开始涌现.本文主要阐述以汇编实现上下文切换的协程方案,并且说明其在异步开发模式中的应用. 本文地址:https://segmentfault.com/a ...
- CentOS下iptables详解
一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...
- Inter exchange Client Address Protocol (ICAP)- 互换客户端地址协议
https://github.com/ethereum/wiki/wiki/Inter-exchange-Client-Address-Protocol-(ICAP) Transferring fun ...
- 11.C++和C的区别,什么是面向对象
c++封装更好,调用接口,c调用子函数 1.首先C和C++在基础语句上没有太大区别,c++在c基础上改进,兼容大部分c的语法结构.c++面向对象,c面向过程. 2.新增new和delete的语法,引用 ...
- 实例详解:MFC坐标轴实现
需求:MFC坐标轴实现-----最好有步骤啊,刚刚才接触C++和MFC啊.MFC怎样在特定区域建立坐标轴,x轴自适应,y轴有固定范围,最好有网格. 解决思路:VC 内存绘图,不闪屏,具体代码如下: / ...
- JSON无限折叠菜单编写
最近看了一篇关于JSON无限折叠菜单的文章 感觉写的不错,也研究了下代码,所以用自己编码方式也做了个demo 其实这样的菜单项在我们网站上或者项目导航菜单项很常见的一种效果,特别是在一些电子商务网上上 ...
- Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
- “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生
错误提示: “System.Reflection.AmbiguousMatchException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理. 发现不明确的匹配. 问题原 ...