一 环境变量
1.1 重新审视a.out
1 question why./a.out可以执行而a.out不可以执行 ls clear统统可以执行
answer:环境变量中的PATH在起作用
PATH当去执行某个可执行程序未指定路径,在PATH中路径挨个寻找是否存在要执行的可执行程序
如何定义赋值 环境变量
export PATH=$PATH:.
env: 当前用户的所有环境变量
环境变量是什么
环境变量一般是操作系统中用来指定操作系统运行环境的一些参数,比如说临时文件夹的位置。
环境变量有很多,对应了不同的用途。
有一个命令env,可以用来显示当前用户的所有环境变量。其中PATH用来指定可执行程序的搜索路径 echo $PATH可以查看
echo $XXX 用来查看具体的环境变量
1.2问题:
为什么sudo ./a.out 打开/etc/passwd文件成功,而./a.out读写打开失败?
当a.out开始执行时会获取一张环境变量表,这张表中记录了当前是哪个用户(权限)来执行的a.out
1.3环境变量
1环境变量的操作
env命令
在C语言中环境变量存在于环境变量表中。环境表中就是一个字符串的数组(字符指针数组)
通过外部的全局变量
environ --->"环境表的地址" 在程序中使用
char **environ
编程:打印所有的环境变量的值
intmain()
{
extern char **environ;
char **p = environ;
while( *p != NULL){
printf("%s\n",*p);
p++;
}
}
把"LANG=zh_CN.utr-8"中的取出来“zh_CN.UTF-8” 保存到一个buf[],最后打印buf
思路:通过environ变量取得环境变量表中的每个环境变量
操作环境变量的函数: getenv setenv unsetenv clearenv putenv
内存管理 malloc/brk/sbrk/mmap 辅助与书籍
5> /*------makefile 三要素----------------*/
目标:依赖
(tab) 命令
a.out:env.c
gcc env.c -o print_env
clean:
rm printf_env
<跟我一起写makefile>
二 linux中常用的库文件
http://www.cnblogs.com/skynet/p/3372855.html
2.1 问题:printf() 函数的实现代码在哪?
ldd a.out 用来显示可执行程序需要的共享库文件,其实就是win中的X.dll动态链接文件,在linux中称为共享库文件printf()函数的实现代码位于libc.so共享库文件中
2.2 静态库文件
就是一些目标文件的集合,通常以.a结尾.静态库在程序链接的时候使用,连接器会将程序中使用到的函数的代码从库文件中拷贝到应用程序中.一旦链接完成,在执行应用程序时就不再需要静态库文件
由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的文件会比较大
创建静态库文件
1) 编辑源程序
2) 编译生成目标
gcc -c xx.c xx.x -o xx.o
gcc calc.c -c -o calc.o
gcc show.c -c -o show.o
3) 打包生成静态库文件
ar -r libzzz.a xx.o yy.o
ar -r libmath.a calc.o show.o
ar [选项] 静态库文件名称,目标文件列表
选项:
-r 将目标文件插入到静态库中 (重点)
-d 从静态库中删除目标文件
-t 以列表方式现实静态库中的目标文件
静态库如何使用
<1> 直接法 (不推荐)
gcc main.c libmath.a
<2> 环境变量法 要申请一个环境变量
export LIBRARY_PATH=LIBRARY_PATH:./
gcc main.c -lmath
<3> 参数法 (从当前目录查找)
gcc main.c -lmath -L./
Linux下使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L选项)、指定静态库名(不需要lib前缀和.a后缀,-l选项)。
比如之前已经生成了 libmath.a的静态库了, -L紧跟路径目录,相当与cd 目录路径, 进去后,这个目录里会有一个libmath.a的静态库, 直接写-lmath就表示要链接libmath.a(不需要lib前缀和.a后缀,-l选项)