开发环境02、静态库、共享库、动态加载和辅助工具

1环境变量的概念和使用

1.1C盘;找program files里面的 Windows media player双击打开这个EXE,黑客会直接启动dos窗口输入路径加上双引号

     环境变量一般是指在操作系统中用来指定操作系统运行环境的/应用程序环境的一些变量

     Path就是一个环境变量,一般来说,应用程序的执行需要带上路径才可以运行,而定义在环境变量Path中的路径系统会自动识别,因此对应的应用程序只需要程序名就可以运行

1.2基本配置

    1Windows系统中的配置

     我的电脑=>右键,选择属性=>高级=>环境变量=>系统变量=>找到Path,点击编辑,在Path变量值得最后增加分号(用于分隔多个路径),再追加新的路径=>一路点击确定即可

    切记不要删除Path变量原来的变量值,以免出现系统无法启动或者正常运行的情况

    2Unix/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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值