Linux系统编程入门
静态库的制作
Linux中: 静态库的命名格式为:libxxx.a Windows中: 静态库的命名格式为:libxxx.lib
如何制作一个静态库(Linux):
- 用gcc生成.o文件
- 用ar工具将.o文件打包:
ar rcs libxxx.a xxx.o xxx.o 其中: r: 将文件插入备存文件中 c:创建备存文件 s:索引
静态库的使用
- 首先利用 g++/gcc 将 .cpp 文件 -c 成 .o 文件
- 然后对所有需要处理的 .o文件:
ar rcs libxxx.a xx.o xxx.o - 然后最后编译 main.cpp 成可执行文件,同时利用
-L (寻找静态库所在的目录) -l (寻找该目录下的所需要的静态库名) - 最后就完成了静态库的使用。
tips:(自言自语)文件在vscode的Linux_coding目录下。
动态库的制作和使用
Linux: 动态库的命名格式为:libxxx.so 是一个可执行文件 Windows: 动态库的命名格式为:libxxx.dll
动态库的制作:
- 利用g++得到 .o 文件,得到和位置无关的代码
g++ -c -fpic xxx.cpp xxx.cpp
- 通过 g++ 得到动态库
g++ -shared xxx.o xxx.o -o libxxx.so
显示不能打开共享的动态库,找不到这样的文件或者目录。
动态库加载失败的原因及解决方法: g++链接时,动态库的代码不会被打包到可执行程序之中。也就是不能直接 ./main 运行
可以使用 ldd main 查看可执行程序的链接情况: 发现没找到我们需要的这个动态链接库
解决动态库加载失败的问题: 法一:临时配置: 此时利用echo命令,发现环境变量被拼接上去了: 并且我们使用ldd main 去查看路径: 可以发现现在我们自定义的动态库也可以被找到了
此时我们就解决了动态库加载失败的问题了。
法二:用户配置:
-
我们使用cd 到根目录下: -
有个.bashrc文件,配置它就好了: -
利用 vim .bashrc 进入该文件,在最后一行加入法一提到的命令: -
然后esc,输入:wq保存并退出,为了使其生效: 此时就解决了动态库的加载问题。
静态库和动态库的对比
静态库和动态库的区别: 来自于连接阶段如何处理,连接成可执行程序。 分别成为静态链接方式和动态链接方式。
Makefile
总结来说:Makefile就是程序化编译及复杂操作的工具,省时省力。
有关Makefile的详细用法,暂时跳过,等到大型工程时再回来学。(学了不用容易忘)
GDB调试
一定要记得 -O
g++ -g -Wall prog.cpp -o prog
给程序设置参数:set args +参数 查看设置的参数:show args
info break 查看断点信息 break 9 在第九行打断点
标准C库的文件IO函数和Linux系统IO函数对比
标准C库IO函数带有缓冲区,而LinuxIO函数没有缓冲区。
open函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd = open("a.txt",O_RDONLY);
if(fd==-1)
{
perror("open");
}
close(fd);
return 0;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include<stdio.h>
int main()
{
int fd = open("crea.txt",O_RDWR | O_CREAT,0777);
if(fd==-1)
{
perror("open");
}
close(fd);
return 0;
}
Linux多进程开发
进程概述
并行:在同一时刻,有多条指令在多个处理器上同时执行; 并发:在同一时刻,只能有一条指令执行,但是多个指令被快速地轮换执行,使得在宏观上具有多个指令同时执行的效果。但是实际上并不是同时执行的,只是把时间分成若干段,多条指令有序交错执行的宏观表现。
进程控制块:
ulimit -a //查看内核信息
//unlimit后面加上对应的参数可以修改对应的默认数值,但是一般不建议修改
进程状态转换
- 三态模型:运行态、就绪态、阻塞态
- 五态模型:新建态、就绪态、运行态、阻塞态、终止态
进入终止态后,这个进程就不会被执行了,但是依然保存在操作系统中等待善后,一旦其他进程完成了对终止态的信息抽取后,操作系统将删除该进程。
top 命令:动态查看进程信息 top -d 0.1 :0.1秒刷新一下
进程创建
|