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
作业:
编程打印空心的菱形和实心菱形,分别使用静态库的方式和动态库的方式进行打包和使用。
**** ****
**** * *
**** * *
**** ****
相关文章推荐
- LinuxC(Unix/Linux系统简介/开发工具)
- 权限管理课堂笔记
- 基于tiny4412的Linux内核移植(支持device tree)(三)
- 基于tiny4412的Linux内核移植(支持device tree)(二)
- 基于tiny4412的Linux内核移植(支持device tree)(一)
- linux用sendmail发邮件
- 编译 Linux 3.5 内核烧写 Android 到tiny4412
- Linux下命令符操作(一)
- 《Linux内核设计与实现》学习总结 Chap5
- linux --> 系统信息命令
- linux内核模块时内核树的作用
- centos 6.5 搭建svn
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- 使用systemd配置SVN服务器自动启动
- Linux将多网口虚拟为一个网卡
- Linux的启动流程
- linux中fork()函数详解(原创!!实例讲解)
- CentOS进入单用户模式
- 用户的主要群组和次要群组
- 移植最新内核linux-3.14.6到mini2440开发板