Unix学习(一)

来源:互联网 发布:闪电下单软件 编辑:程序博客网 时间:2024/06/05 17:15

gcc选项:
-c
-std=
-E
-o 输出文件名
-S 产生汇编代码
-Wall 显示全部警告
-On 优化,n可以是1/2/3表示优化的程度
-i filename 指定要包含的头文件
-I dir指定头文件所在的目录
-l libname 指定要使用的库名
-L dir指定库文件所在的目录
-fpic 生成独立地址代码,代码不包含相对地址
-share 生成动态库
-static 使用静态库
-g 会产生调试信息在可执行文件中

Linux常识
文件路径:绝对路径(从根目录/开始),相对路径(从./说起)。
环境变量:env查看环境变量,查看的是全局的环境变量,set显示所有环境变量和环境函数
设置环境变量:
局部变量的设置:变量名=变量值
全局变量:export 变量名=变量值
都只是针对当前进程而言。全局变量能够传递给子进程。
进程:每个程序的每一次运行都称为一个进程。同一个程序运行两份就是两个进程。一个进程如果开启另外一个进程,那么新的进程就是旧的进程的子进程。旧的进程就称为父进程。
Ctrl+Z暂停当前的进程
ps显示进程状态。ps -f, ps -l显示更详细的进程状态。ps -e显示所有进程,默认只显示当前终端的进程。
ps -l中的S列代表进程状态。S 睡眠状态,T挂起暂停,R正在运行,Z僵尸。
jobs命令显示有哪些后台任务,包括编号和状态以及优先级。
bg %n,可以让后他挂起的进程重新在后台运行,如果不带%n那么就运行带有优先权的后台进程。
fg%n 让后台任务n在前台运行,不指定n就前台运行带有优先权的进程。
占用终端输入的那个进程就是前台进程。
命令后加&就可以让进程直接在后台运行。
取得环境变量的值:echo{变量名}。
grep -H -n 字符串 文件名 从文件中查找有指定字符串的行。-H显示文件名,-n显示所在的行号,-i忽略大小写,如果没有指定文件名那么就从标准输入读取数据
管道:命令1 | 命令2、
把命令1的标准输出作为命令2的标准输入
环境变量PATH一系列目录一冒号分割,系统只在这些目录寻找可执行文件。

3、库library
静态库在编译链接的时候就吧库里代码提取出来加入到最后的可执行文件中,程序执行时不再依赖库。动态库在编译链接的时候只记录要用的名字在哪个库中,运行时才从库文件中找这个名字(函数或者变量)并且访问它。可执行文件大小、运行速度、库的升级。
1)静态库(归档) libxxx.a
CPATH,C_INCLUDE_PATH这两个环境变量都可以用来指定gcc编译的时候搜索头文件目录,类似-I选项。
(1)产生库
写C语言程序(一般不该有main函数)
gcc -c xxx.c
gcc -c xxx2.c
写一个头文件,里面放些函数和变量的声明。
ar -r libxxx.a xxx.o xxx2
打出来的包就是一个静态库
(2)使用库
写C语言程序并且包含头文件xxx.h,程序中可以调用库中的函数或者全局变量。
方式1: gcc -c usexxx.c;
gcc usexxx.o libxxx.a
方式2:gcc -c usexxx.c;
gcc usexxx.o -lxxx -L. 其中-lxxx表示要链接libxxx.a文件(xxx为库名),-L.表示在当前目录下找库文件libxxx.a文件。
方式3:先设置全局环境变量LIBRARY_PATH设置库文件的目录。然后gcc -c usexxx.c; gcc usexxx.o -lxxx
2)动态库(共享库)libxxx.so
(1)产生库
写C语言程序(一般不应该有main函数)
gcc -c -fpic xxx.c xxx2.c
gcc -shared -o libxxx.so xxx.o xxx2.o
(2)使用库
动态库使用的时候才会加载,所以使用分为两个步骤。
编译时:
编写程序usexxx.c,然后开始编译和链接
方式一:
gcc -c usexxx.c;
gcc usexxx.o -lxxx -L.
方式二:
设置环境变量LIBRARY_PATH
gcc -c usexxx.c
gcc usexxx.o -lxxx
运行时:
方式一:把库文件放到系统标准库的目录中/usr/lib或者lib目录中,然后直接运行生成的a.out就行
方式二:设置环境变量LD_LIBRARY_PATH的值为库文件所在的目录然后运行a.out。
动态库的升级:可以直接替换掉旧的库so文件,不必更新可执行文件

0 0