1环境变量的概念和使用
1.1C盘;找program files里面的 Windows media player双击打开这个EXE,黑客会直接启动dos窗口输入“路径”(加上双引号)
环境变量一般是指在操作系统中用来指定操作系统运行环境的/应用程序环境的一些变量
Path就是一个环境变量,一般来说,应用程序的执行需要带上路径才可以运行,而定义在环境变量Path中的路径系统会自动识别,因此对应的应用程序只需要程序名就可以运行
1.2基本配置
1、Windows系统中的配置
我的电脑=>右键,选择属性=>高级=>环境变量=>系统变量=>找到Path,点击编辑,在Path变量值得最后增加分号(用于分隔多个路径),再追加新的路径=>一路点击确定即可
切记不要删除Path变量原来的变量值,以免出现系统无法启动或者正常运行的情况
2、Unix/Linux系统中的配置
export PATH=$ PATH:.
export导入的意思
$ PATH表示将环境变量PATH值 值取出来
:表示多个路径之间的分隔符
. 表示当前目录的路径
表示将当前目录的路径追加到PATH的环境变量值中(一次性的,只是针对当前终端生效)
vi ~/.bashrc,打开文件,在文件的最后增加代码:
export PATH=$PATH:.
export PS1='\W$'
=>表示终端的提示符只显示一个单词,使用$结尾
source ~/.bashrc
=>使得配置文件立即生效
echo 字符串
=>字符串原样输出(回显命令)
echo $ SHELL
=>获取环境变量SHELL的值,进行回显
echo $ PATH
=>获取PATH的值,进行回显
1.3 编程相关的环境变量
C_INCLUDE_PATH/CPATH C头文件的附加搜索路径
CPLUS_INCLUDE_PATH C++头文件的附加搜索路径
LIBRARY_PATH 链接库文件时查找的路径
LD_LIBRARY_PATH 运行时查找共享库的路径
1.4 头文件的查找方式
1 #include<...>
表示去系统默认的路径中查找该头文件
/usr/include/stdio.h
2 #include"..."
表示优先在当前工作目录下查找该头文件
3 配置环境变量
export CPATH=$CPATH:..=>一次性
4 使用编译选项 -I
gcc/cc *.c -I 头文件的路径
gcc/cc *.c -I ..
注意:
对于查找头文件的方式1/2来说,缺点在于头文件的位置一旦发生改变,则需要修改源程序,对于方式3来说,缺点就在于多个目录工程之间可能相互影响,所以建议使用方案4
练习:采用多文件的编程结构:vi add.h add.c main.c实现计算两个int类型参数的和,
2.1库文件的概念
库文件主要分成两种:静态库文件和动态库文件
1. 静态库的特性
a.静态库在使用时,直接把代码复制到目标文件中
b.优点:不需要跳转,效率比较好;脱离静态库文件
c.缺点:目标文件会比较大;修改和维护不方便
2. 共享库文件的特性
a.共享库在使用时,直接把代码对应的地址复制过来
b.优点:目标文件比较小;修改和维护都比较方便
c.缺点:需要跳转,效率比较低;不能脱离共享库文件
3. 基本命令
ldd a.out =>表示查看a.out所链接的共享库信息
gcc -static xx.c -o b.out =>表示以静态库方式进行处理比较发现,静态库方式生成文件比较大
-static 强制要求按照静态库的方式进行处理
-o b.out 制定输出文件名
2.2 静态库的生成和使用步骤
1. 静态库的生成步骤
a.编写源代码(xxx.c文件)
vi add.c文件(这里面写功能代码 ??????????????????????????????????????????????????)
b.只编译不链接生成目标文件(xxx.o文件)
gcc/cc -c add.c
c.生成静态库文件
ar -r lib库名.a 目标文件
ar -r libadd.a add.o
ar 处理静态库文件
-r 表示插入的意思
注意:
静态库文件的命名规则:以lib开头,以.a结尾 例如:libadd.a
静态库文件名和库名是不同的概念,库名没有前缀和后缀 例如:add
2. 静态库的使用步骤
a.编写测试代码(xxx.c)
vi main.c文件
b.只编译不链接生成目标文件(xxx.o)
gcc/cc -c main.c
c.链接测试文件和静态库文件,链接的方式有三种
1.直接链接
cc main.o libadd.a
2.使用编译选项进行链接
gcc/cc main.o -l 库名 -L 库文件所在的路径
gcc/cc main.o -l add -L .
3配置环境变量LIBRARY_PATH:.
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc/cc main.o -l add
2.3共享库的生成和使用步骤
1.共享库的生成步骤
a.编写源代码(xxx.c)
vi add.c 文件
b.只编译不链接生成目标文件(xxx.o)
gcc/cc -c -fpic/*小模式,代码少*/add.c
c.生成共享库文件
gcc/cc -shared 目标文件(xxx.o)-o lib库名.so
gcc/cc -shared/*共享*/ add.o -o libadd.so
2.共享库的使用步骤
a.编写测试代码(xxx.c)
vi main.c文件
b.只编译不链接生成目标文件(xxx.o)
gcc/cc -c main.c
c.链接测试文件和共享库文件,链接的方式有三种
1.直接链接
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.解决运行时找不到共享库的问题
cc main.o libadd.so
2.使用编译选项进行链接
gcc/cc main.o -l 库名 -L 库文件所在的路径
gcc/cc main.o -l add -L .
3配置环境变量LIBRARY_PATH:.
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc/cc main.o -l add
注意:
直接链接,共享库的使用要求配置环境变量LD_LIBRARY_PATH的值,主要解决运行时找不到共享库的问题
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
2.4共享库的动态加载
1.dlopen函数
void *dlopen(const char *filename, int flag);
char *dlerror(void);
第一个参数:字符串形式的共享库文件名
第二个参数:标志
RTLD_LAZY 延迟加载
RTLD_NOW 立即加载
返回值:通用类型指针:就是句柄,暂时理解为地址,失败返回NULL
函数功能:主要用于打开和加载共享库文件
2.dlerror函数
char *dlerror(void);
函数功能:主要用于获取dlopen等函数调用过程发生的最近一个错误的详细信息,返回空则表示没有错误发生
3.dlsym函数
void *dlsym(void *handle,const char *symbol);
第一个参数:句柄,也就是dlopen函数的返回值
第二个参数:字符串形式的符号,表示函数名
返回值:成功返回函数在内存中的地址,失败返回null
函数功能:主要用于根据句柄和函数名获取在内存中的地址
4.dlclose函数
int dlclose (void *handle);
函数功能:
主要用于关闭参数handle所指定的共享库,成功返回0,失败返回非0,当共享库不再被任何程序使用时,则回共享库所占用的内存空间
注意:
编译连接时需要增加选项:-ldl