您的位置:首页 > 运维架构 > Linux

LinuxC(环境变量、动态库)

2016-03-22 17:09 489 查看

环境变量:

PATH就是一个环境变量,存放的是一些系统或者软件的路径,在PATH中添加过路径的应用程序,可以直接使用文件名进行调用。

环境变量的配置:

1) Windows 系统的配置

我的电脑 => 右键,选择属性 => 高级 => 环境变量 => 系统变量PATH => 在原来的PATH后加分号‘;’加具体的路径。

2) linux系统环境变量

export PATH=$PATH:.

解析:$PATH – 将原来的PATH的内容获取出来

: - 各种路径之间的分割符号

. - 当前目录

echo $PATH - 将PATH的内容打印出来(回显)。

只会在当前终端中有用,想永久有用则可以打开

vi ~/.bashrc <回车>

在该文件的末尾添加

export PATH=$PATH:.

执行source~/.bashrc 这样就可以让配置文件生效。

3) 编程相关的环境变量

CPATH – C语言头文件的路径

LIBRARY_PATH – 库文件的路径

LD_LIBRARY_PATH – 加载共享库的路径

4) 查找头文件

a) <>表示从系统默认的路径下查找该文件

一般来说在 /usr/include/目录下

b) “”表示从当前文件目录下查找该文件

c) 配置相关的环境变量CPATH

如: export CPATH=$CPATH:..

d) 通过编译选择项指定头文件的位置

gcc –I文件路径 xxx.c

大写I后面跟路径

库文件

为了调用者使用方便,一般程序不会直接提供.c文件或.o文件,而是将文件打包成具体的库文件,只需要提供库文件和对应的头文件即可。

1)分类

库文件主要分为:静态文件 和 共享库文件

2)比较

静态库:

使用静态库时,直接把代码/指令复制到目标文件中,目标文件显得比较庞大,修改和维护都不方便;可以脱离静态库文件,效率比较高。

共享库:

使用共享库时,把代码/指令对应的地址复制到目标文件中,目标文件比较小,修改和维护比较方便;不可以脱离共享库文件,效率比较低(使用频繁)。

3)相关的命令

Ldd a.out => 查看a.out 所以来的动态库文件

gcc/cc -static xxx.c =>要求按照静态库方式编译链接,得到的可执行文件会比较大。

静态库文件的生成布局和使用

(1)静态库的生成步骤

a) 编写源代码 xxx.c 如:adder.c

b) 只编译不连接,如:gcc -c adder.c 生成adder.o

c) 使用命令ar –r lib库名.a xxx.o生成静态库

如: ar –r(插入) libadder.a adder.o

(2)静态库的使用步骤

a) 编写调用的源程序 xxx.c 如vi main.c

b) 只编译不连接源程序如:gcc –c main.c

c) 链接目标文件和静态库文件

i. 直接链接

gcc main.o libadder.a

ii. 通过选项链接(掌握)

gcc main.o –l(小写)库名 –L(大写).库文件所在路径

gcc main.o –l adder –L.

iii. 配置环境变量LIBRARY_PATH

Export LIBRARY_PATH=$LIBRARY_PATH:.

gcc main.o –l adder

共享库的生成步骤和使用步骤

(1)共享库的生成步骤

a) 编写源程序xxx.c 如:adder.c

b) 只编译不连接

如:gcc –c –fpic(小模式) adder.c

c) 使用选项生成共享库

如:gcc -shared adder.o –o lib库名 .so

(2) 共享库的使用步骤

a) 直接链接

gcc main.o libadder.so

b) 使用选项链接

gcc main.o -l adder -L.

c) 使用环境变量LIBRARY_PATH

export LIBRARY_PATH=$LIBRARY_PATH:.

gcc main.o –l adder

注意:

对共享库文件的使用,要配置环境变量后再运行

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

关于共享库文件的动态加载

dlopen 函数

#include<dlfcn.h>

void *dlopen(const char *filename, int flag);

第一个参数:文件名

第二个参数:打开标志/打开方式

RTLD_LAZY -----延迟加载

RTLD_NOW-----立即加载

函数的功能:

按照第一个参数指定的文件名去(延迟/立即)加载动态库。

成功返回一个void * 的句柄。

dlerror函数

char *dlerror(void);

函数功能:表示返回最后一次错误的信息,如果没有错误就返回NULL

dlsym函数

void *dlsym(void *handle, const char *symbol);

第一个参数:dlopen函数的返回值

第二个参数:字符串类型的函数名

函数功能:获取handle指向的共享库文件中的symbol加载

dlclose函数

int dlclose(void*handle);

函数功能:关闭指定的共享库文件

注意:编译时需要增加: -ldl

作业:

编程打印空心的菱形和实心菱形,分别使用静态库的方式和动态库的方式进行打包和使用。

**** ****

**** * *

**** * *

**** ****
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: