没有合适的资源?快使用搜索试试~ 我知道了~
linux下C语言开发笔记整理
需积分: 49 12 下载量 129 浏览量
2019-02-16
14:19:49
上传
评论 3
收藏 309KB PDF 举报
温馨提示
试读
43页
linux下C语言开发,从基础到网络通信笔记学习资料,如有想了解可以私聊
资源推荐
资源详情
资源评论
UC_bj
1.课程的简介
1.1 课程阶段的阶段
Unix/linux系统下的基本命令
=> 主要学习常用的命令以及vi编辑器的使用
=> 依赖于具体的操作系统,所有的命令在unix/linux系统
中可以使用,但是在windows系统中可能无法识别
标准C语言
=> 主要学习标准C语言的基本语法知识;
=> 不依赖于具体操作系统,支持Unix/linux/windows系统
数据结构和算法
=> 主要学习常用数据结构的特性以及常用的算法思想
=> 不依赖于具体的编程语言,支持C/C++/...
=> 不依赖于具体操作系统,支持Unix/linux/windows系统
Unix/linux系统下的高级C编程
=> 主要学习常用的API函数以及系统的部分原理知识
=> 依赖于具体的操作系统,支持Unix/linux系统
=> 依赖于具体的编程语言,支持C语言的语法知识
=> 理论时间是:15天左右
目前主流的操作系统:Unix/linux/windows系列
windows系统:xp/vista/win7/win8.1/win10
目前主流的移动终端操作系统:
android/ios/windows phone
1.2 uc课程内容的简介
(1)Unix/linux系统下的编程基础以及开发方式
(2)Unix/linux系统下的内存管理技术
(3)Unix/linux系统下的文件管理以及目录操作
(4)Unix/linux系统下的进程管理技术
(5)Unix/linux系统下的信号处理技术
(6)Unix/linux系统下的进程间通信技术
(7)Unix/linux系统下的网络编程技术
(8)Unix/linux系统下的多线程开发技术
-----------------------------------------------------
今天内容:
(1)Unix/linux系统的简介
(2)gcc编译器的使用
(3)多文件结构的编程
(4)常用的预处理指令
(5)环境变量的概念和使用
1.Unix/linux系统的简介
1.1 Unix系统的简介
在1969年,编写操作系统采用汇编指令,编写、修改以及维护时都非常不方便,贝尔实验室 汤普逊 研发了一门语
言,叫做B语言,丹尼斯-里奇 在B语言的基础上做了修改和扩展,
叫做New B语言,后来改名为C语言;
C语言诞生于1972年,至今在编程语言排行榜上占据重要的地位;
Unix系统诞生于1970年,具有支持多用户、多任务以及多种处理器的特点;
1.2 linux系统的简介
linux系统是一款自由免费开放源代码的类Unix操作系统;
当前教学环境: ubuntu12.04 32位的操作系统
每半年发布一个新版本:4月 + 10月
2.gcc编译器的使用
2.1 基本概念
gcc原名叫做 GNU C Compiler(编译器),只是支持对C语言程序的编译,后来对该编译器进行了扩展,除了支持对C程
序的编译之外,又支持了对C++、Object-c等语言的支持,于是改名为GNU Compiler Collection(集合);
2.2 基本功能
目前主流的编程都采用高级语言进行编写,如:C语言,但是高级语言编写的源代码文件是无法被计算机执行的,需
要通过编译链接生成最终的可执行文件,才能被计算机执行;
根据高级源代码文件生成可执行文件的过程需要使用gcc编译器来实现,具体的流程包括以下四步:
(1)预处理/预编译
- 主要用于实现头文件的扩展以及进行宏替换等;
(2)编译
- 主要用于将高级源代码翻译成汇编语言,生成汇编文件;
(3)汇编
- 主要用于将汇编语言翻译成机器指令,生成目标文件;
(4)链接
- 主要用于将目标文件和库文件链接起来,生成可执行文件
注意:
第 1 页
UC_bj
其中(1)(2)(3)这三步统称为广义上的编译;
练习:
cc -E 01hello.c -o 01hello.i
cc -S 01hello.i/01hello.c
cc -c 01hello.s/01hello.i/01hello.c
cc 01hello.o/01hello.s/01hello.i/01hello.c
2.3 常用的编译选项
(1)掌握的编译选项
gcc/cc -E 预处理,缺省输出到屏幕,可以使用-o选项来指定输出文件名(xxx.i)
gcc/cc -S 编译,将高级语言文件翻译成汇编语言文件(xxx.s)
gcc/cc -c 汇编,将汇编语言文件翻译成机器语言文件(xxx.o)
gcc/cc -o 用于指定输出文件名
gcc/cc xxx.c 编译链接,生成可执行文件a.out
(2)熟悉的编译选项
gcc/cc -std 用于指定具体的C标准
gcc/cc -v 用于查看编译器的版本信息
gcc/cc -Wall 用于尽可能显示所有的警告信息
gcc/cc -Werror 用于将警告当作错误处理
(3)了解的编译选项
gcc/cc -g 用于生成调试信息,可以进行gdb调试
gcc/cc -x 用于显示指定源代码的编程语言
gcc/cc -O 用于进行优化处理
(4)扩展的编译选项
man gcc 表示查看gcc的编译选项等信息
作业:安装英文词典 - 星际译王
2.4 常用编程相关的文件后缀
.h - 头文件 .c - 源文件
.i - 预处理文件 .s - 汇编文件
.o - 目标文件
.a - 静态库文件 .so - 共享库文件
3.多文件结构的编程
3.1 多文件结构的主要组成
.h - 头文件,主要编写结构体的定义,函数声明等
.c - 源文件,主要编写函数的定义等
.a - 静态库文件,主要对具体功能模块的打包
.so - 共享库文件,主要对具体功能模块的打包
3.2 头文件的详细组成(重点)
(1)头文件卫士
#ifndef xxx_H
#define xxx_H
#endif // xxx_H
(2)包含其他头文件
#include <stdio.h>
... ...
(3)进行宏定义
#define PI 3.14
... ...
(4)结构体的定义以及对数据类型起别名
struct student
{
int id;
char name[20];
};
typedef struct student Student;
(5)外部变量的声明和函数的声明
extern int num;
void show(void);
注意:
不要将变量/函数的定义放在头文件中,因为当该头文件被多个源文件包含,而这多个源文件又一起编译链接时,会
造成重定义的链接错误;
练习:
按照以下要求编写多文件结构程序:
vi circle.h文件 - 声明两个根据参数传入的半径计算圆形周长和面积的函数,circle_length circle_area
vi circle.c文件 - 定义上述两个函数
vi main.c文件 - 要求提示用户输入一个整数半径,调用上述两个函数计算周长和面积,并打印出来
周长: 2 * 3.14 * r;
面积: 3.14 * r * r;
第 2 页
UC_bj
明日预报:
(1)常用的预处理指令
(2)环境变量的概念和使用
(3)库文件的概念和使用
复习:
1.Unix和linux系统的简介
1.1 Unix系统的简介
C语言诞生于1972年,至今在编程语言排行榜占据重要地位
Unix系统诞生于1970年,具有支持多用户、多任务、以及支持多种处理器的特点;
1.2 linux系统的简介
linu系统是一款自由免费开放源代码的类Unix系统;
2.gcc编译器的使用
2.1 基本概念
原名叫做GNU C Compiler,后来该名为GNU Compiler Collection;
2.2 基本功能
gcc主要用于根据高级源代码文件来生成最终的可执行文件,而整个生成过程分为:预处理/预编译、编译、汇编、
链接
2.3 常用的编译选项
-E -S -c -o
-std -v -Wall -Werror
man gcc/cc
2.4 编程相关的常见文件后缀
.h .c .i .s .o
.a .so
3.多文件结构的编程
3.1 多文件结构的主要组成
.h .c .a .so
3.2 头文件的详细组成(重点)
(1)头文件卫士
#ifndef ....
#define ....
#endif ....
(2)包含其他头文件
#include <stdio.h>
(3)进行宏定义
#define PI 3.14
(4)结构体的定义以及对数据类型起别名
typedef struct node
{
int data;
struct node* next;
}Node;
(5)外部变量/函数的声明
extern int num;
void show(void);
注意:
不要将变量/函数的定义放在头文件中;
-----------------------------------------------------
今天内容:
(1)常用的预处理指令
(2)环境变量的概念和使用
(3)库文件的概念和使用
1.常用的预处理指令
1.1 复习标C中学过的预处理指令
#include 包含 ...
#define 定义 ...
#undef 取消宏定义
#ifndef 如果没有定义 ...
#ifdef 如果定义 ...
#if 如果 ...
#elif 否则如果 ...
#else 否则 ....
#endif 结束如果
... ...
第 3 页
UC_bj
1.2 学习UC中常用的预处理指令
#line 整数n
=> 主要用于将下一行的行号修改为第n行
=> 主要用于调试阶段确保产生错误的行号保持不变
#warning 字符串
=> 主要用于在调试阶段产生警告信息
#error 字符串
=> 主要用于在调试阶段产生错误信息
注意:
#if - 主要用于在编译链接阶段进行条件的判断
if - 主要用于在可执行文件执行的阶段进行条件判断
#pragma GCC dependency 文件名
=> 表示当前文件依赖于指定的文件名,如果指定文件名的
最后一次修改时间晚于当前文件,则产生警告信息;
如:
vi show.c文件:
void show(void)
{
printf("我是帅哥我怕谁\n");
}
vi main.c文件:
#pragma GCC dependency "show.c"
int main(void)
{
show();
return 0;
}
#pragma GCC poison 标识符
=> 主要用于将指定的标识符设置为毒药,一旦使用则产生
错误信息
#pragma pack(整数n)
=> 主要用于调整结构体的对齐和补齐方式为n的整数倍
=> 结构体的对齐和补齐方式主要便于存取数据的操作,
执行效率更高一些,而调整结构体的对齐和补齐方式
主要为了节省内存空间
1.3 常用的预定义宏
__FILE__ 主要用于获取当前宏所在的文件名称 %s
__LINE__ 主要用于获取当前宏所在的行号信息 %d
__TIME__ 主要用于获取当前宏所在文件的最后一次编译时间 %s
__DATE__ 主要用于获取当前宏所在文件的最后一次编译日期 %s
... ...
2.环境变量的概念和使用
2.1 基本概念
环境变量本质就是指在操作系统中用于指定操作系统运行环境的一些参数,也就是用于存放和系统/软件环境相关信
息的特殊变量;
Path/PATH本质就是一个环境变量,可以将应用程序的路径信息存放在该环境变量中,放置完毕之后,可以直接通过
应用程序名称来启动该程序,而不再需要路径信息;
2.2 配置方法
(1)windows xp中的配置方法
我的电脑 => 鼠标右键 => 选择属性 => 高级 => 环境变量 => 系统变量 => 找到Path,点击编辑,在Path变量值
的最后增加分号,增加新路径 => 一路点击确定即可
其中分号就是不同路径之间的分隔符
切记不要修改Path原来的变量值,以避免造成系统无法启动等问题;
(2)linux系统中的配置方法
打开任意一个终端,执行以下命令:
export PATH=$PATH:.
$PATH - 表示获取环境变量PATH原来的变量值
: - 不同路径之间的分隔符,相当于windows中的分号
. - 表示当前目录,也就是a.out可执行文件所在路径
此配置方法只针对当前终端有效,为了使得环境变量的配置对后续所有打开的终端都有效,则需要按照以下方法配
置:
vi ~/.bashrc文件,在文件的最后增加上述指令
source ~/.bashrc,使得该文件的配置指令立即生效
处理意外情况的方法:
打开主目录 => 使用快捷键ctrl+h来显示所有文件,包括隐藏文件 => 找到.bashrc文件 => 鼠标右键,选择文件编
第 4 页
UC_bj
辑器打开 => 修改后保存 => 在终端中重新source执行一下即可
2.3 编程相关的常用环境变量
CPATH/C_INCLUDE_PATH - 主要用于存放C语言头文件的路径
CPLUS_INCLUDE_PATH - 主要用于存放C++语言头文件的路径
LIBRARY_PATH - 主要用于存放库文件所在的路径
- 主要解决编译链接时找不到库文件的问题
LD_LIBRARY_PATH - 主要用于存放共享库所在的路径
- 主要解决运行时找不到库文件的问题
练习:
采用多文件结构进行编程,具体要求如下:
mkdir add => cd add
vi add.h : 声明一个计算两个整数参数和并返回的函数,其中函数名add_int;
vi add.c : 定义头文件中声明的函数;
vi main.c: 调用add_int函数计算任意两个整数之间的和,并将计算结果打印出来;
2.4 头文件的查找方式
(1)#include <>
- 表示从系统默认的路径中查找头文件;
- 当前系统默认的路径是:/usr/include/
- 使用命令whereis stdio.h来进行查找
(2)#include ""
- 表示优先从当前工作目录中查找头文件,如果查找不
成功,也会去系统默认的路径中进行查找;
(3)配置环境变量CPATH/C_INCLUDE_PATH
- export CPATH=$CPATH:..
此配置方法只对当前终端有效;
(4)通过编译选项来查找头文件
gcc/cc xxx.c -I 头文件所在的路径信息
gcc/cc *.c -I ..
注意:
方式(1)(2)的缺点在于:一旦头文件的位置发生改变,则需要修改源程序的代码来解决该问题;
方式(3)的缺点在于:当有多个工程/项目时,该方式可能会引起冲突问题;
方式(4)既不需要修改源程序的代码,也不会引起多个项目之间的冲突,因此推荐使用该方式;
3.库文件的概念和使用
在大型项目中,如果将每个函数都放在独立的.o文件中,则项目的管理是灾难,使用库文件可以解决该问题;
一般来说,可以将一个功能模块中的所有.o文件打包成一个或者多个库文件,编写者只需要提供库文件和头文件即
可;
库文件主要分成两大类:静态库 + 共享库
3.1 静态库的基本概念和特性
(1)基本概念
静态库本质就是由若干个目标文件(.o)打包生成的.a文件
链接静态库的本质就是将被调用的代码指令复制到调用模块中,体现在最终的可执行文件中;
(2)基本特性
静态库占用空间比较大,也就是最终生成的可执行文件比较大,库中代码一旦修改则需要重新链接才能体现在最终
的可执行文件中;
使用静态库的代码在运行时不需要依赖静态库,并且不需要跳转,因此执行效率比较高;
注意:
使用ldd a.out命令可以查看a.out所依赖的共享库信息
使用gcc/cc -static xxx.c 表示强制要求链接静态库
3.2 静态库的生成和调用步骤
(1)生成步骤
a.编写源代码文件xxx.c,如:vi add.c
b.只编译不链接生成目标文件xxx.o,如:
cc -c add.c
c.生成静态库文件
ar -r/*插入,若存在则更新*/ lib库名.a 目标文件
ar -r libadd.a add.o
(2)调用步骤
a.编写源代码的测试文件xxx.c,如:vi main.c
b.只编译不链接生成目标文件xxx.o,如:
cc -c main.c
c.链接静态库文件,链接的方式有以下三种:
1)直接链接
cc main.o libadd.a
2)采用编译选项进行链接
cc 测试文件的目标文件 -l 库名 -L 库文件所在路径
cc main.o -l add -L .
3)配置环境变量LIBRARY_PATH
第 5 页
剩余42页未读,继续阅读
资源评论
刘进洋
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端vue框架,后端ssm+springboot框架,网站开发.zip
- 基于springboot的快速开发框架.zip
- 基于springboot的分布式权限管理系统,易读易懂、界面简洁美观.zip
- 基于SpringBoot Mybatis-Plus TypeScript的微服务多租户SaaS管理快速开发框架 .zip
- 论文复现:QA-GNN: Reasoning with Language Models and Knowledge
- ipp(intel-oneAPI)下载地址.txt
- 基于spring-boot dubbox搭建的java分布式系统的前端管理.zip
- VLC+Qt demoVLC+Qt demo
- 海彪&龙梅子 - 寂寞的人伤心的歌 (DJ版) [mqms2].ogg
- 530springboot + vue 旅游管理系统.zip(可运行源码+数据库文件+文档)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功