回忆昨天的内容
一、什么是操作系统
计算机的操作系统是一款管理计算机资源的软件,
计算机资源包括硬件资源和软件资源。
系统软件 应用软件
二、计算机语言的发展史
机器语言 汇编语言 C语言
预处理 编译 汇编 链接 加载
今天内容
一、大型项目的代码组织
规则 约定
头文件内容:
1头文件卫士#ifndef....
2函数的声明
3文件的包含
4宏定义
5类型的定义
6变量的声明 int val;extern int val;
变量的声明和定义的区别
变量的定义是为变量分配空间的,变量的声明是变量的空间已经存在,扩充变量的作用域。
编写代码 实现工程
代码参见 pmath文件夹
编译的基本单位是源文件,编译的时候,在检查程序是不是符合C语言的语法
nm 二进制文件
查看二进制文件中的符号表
符号表 存放的是程序中的符号 函数的名字,全局变量的名字,静态局部变量的名字
目标文件 可重定位的目标文件
file 文件名 查看文件类型
链接发生在生成可执行文件的时候 静态链接
动态链接 发生在程序执行的时候
二、静态库的制作和使用
函数库 仓库文件里存放的是多个函数
根据函数库中函数链接的方式,分为静态库和动态库
静态库的命名规则 lib+库名.a
静态库的制作步骤:
1 将要加入静态库的源文件编译为目标文件
2 将这些目标文件加入到静态库文件中,创建静态库文件
ar -r libt_math.a *.o
3 使用静态库文件链接生成可执行文件
gcc mailou.o -Lpmath -lt_math
-L路径 链接器到这个路径下找库文件
-l库名 指定要链接的库的名字
系统指定路径 -I路径 将路径添加到系统指定路径
三、环境变量的初识
环境变量跟进程相关,进程的环境变量
程序和进程的关系
程序是计算机指令的集合,存储在硬盘
进程是正在运行的程序,存储在内存
一个程序运行一次产生一个进程,进程实际上是程序执行过程中对计算机资源使用情况的描述
进程是程序运行的实例
每个进程都有自己的身份证 pid
bash进程的环境变量和自定义变量
如何查看bash进程的环境变量env
USER=tarena
格式:name=value
=号两边绝对不允许空格
如何获取一个环境变量的值呢?
$name 取环境变量name的值
echo字符串 将字符串输出到显示器
echo $USER 将环境变量USER的值输出到显示
怎么改变环境变量的值
name=newvalue
如何增加一个环境变量
1、增加一个自定义变量
name=value
补充:管道,
grep 字符串 文件名 在文件中查找字符串,将包含字符串的行全部显示出来。
command1|command2 command1的标准输出是command2的标准输入
env|grep USER
2、将自定义变量变为环境变量
export 变量名
PATH export PATH=$PATH:.
vi ~/.bashrc打开环境变量 ,用户可以在里面修改
PS1 指定shell的提示符 PS1=“\W\$”只显示最后一个文件夹
~ 用户的家目录
四、动态库的制作和使用
一、制作和使用的步骤
1、将要加入的动态库的源文件编译为目标文件(与位置无关)
gcc -c *.c -fPIC
2、将第一步生成的目标文件,打包进动态库中
gcc -shared -o libt_math.so *.o
3、使用动态库生成可执行文件
gcc mailou.c -Lpmath -lt_math
4、运行啊.out
动态库也叫共享库
加载器 加载a.out到内存执行的之后,需要加载a.out依赖的动态库文件
如何查看a.out依赖哪一些动态库
ldd a.out
此时需要让加载器找到动态库
1 使用环境变量告诉加载器的搜索路径
LD_LIBRARY_PATH=pmath
export LD_LIBRARY_PATH
或者export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
LD_LIBRARY_PATH 有很多的路径,这些路径是加载器找动态库的路径
2 加载器和链接器默认的路径是/lib或者/usr/lib,可以将动态库剪切到该路径
二、动态加载
在程序执行过程中,需要加载某个动态库的时候,向动态链接器发送加载所需动态库的请求。动态链接器加载动态库。这个就是动态加载。
动态链接器也是一个程序,要和程序通讯,了解和动态连机器通讯的接口就可以
dlopen(3) dlclose(3) dlerror(3) dlsym(3)
- mailou.c
#include<stdio.h>
#include"pmath/tmath.h"
int main(void){
int a=6,b=2;
printf("%d+%d=%d\n",a,b,t_add(a,b));
printf("%d*%d=%d\n",a,b,t_mul(a,b));
printf("%d/%d=%d\n",a,b,t_div(a,b));
printf("%d-%d=%d\n",a,b,t_sub(a,b));
return 0;
}
- tmath.h
#ifndef T_MATH_H_
#define T_NATH_H_
int t_add(int,int);
int t_sub(int,int);
int t_mul(int,int);
int t_div(int,int);
#endif
- add.c
#include"tmath.h"
int t_add(int x,int y){
return x+y;
}
int t_div(int x,int y){
return x/y;
}
int t_sub(int x,int y){
return x-y;
}
int t_mul(int x,int y){
return x*y;
}