【C语言】库的介绍及创建

您所在的位置:网站首页 共享库是什么 【C语言】库的介绍及创建

【C语言】库的介绍及创建

2023-08-07 07:26| 来源: 网络整理| 查看: 265

一、什么是库

库也叫代码库,可以把一个些目标文件合并在一起方便使用。库是一个二进制可执行的文件,需要被载入到内存中才能使用。windows和linux都有自己的库,两者是不兼容的。

二、库的分类

静态库: 在链接时把库的二进制指令复制到调用模块中。 共享库(动态库): 会和调用者一起加载到内存,当执行调用语句时会从程序的调用位置跳转到共享库中运行,共享库要有执行权限。 库文件后缀:

windowslinux静态库XXX.lbXXX.a动态库XXX.lldXXX.so

优缺点: 静态库的优点:运行速度快,但维护麻烦,当静态库中的内容更新后需要重新编译程序,使用静态库编译出的可执行文件会比共享库的要大。 共享库的优点:使用方便,共享库如果发生变化不需要重新编译程序,使用它编译出的可执行文件比使用静态库要小,运行速度要比使用静态库慢。

三、静态库的创建和使用(Linux)

1、创建静态库 编辑静态库原码:vim .c/.h 编译出目标文件:gcc -c xxx.c -> xxx.o 把目标文件打包成静态库文件:ar -r libxxx.a x1.o x2.o ... ar 是一个专门控制静态库的命令 -r 把目录文件合并成一个静态库,如果静态库文件已经存在则更新。 -q 向静态库中添加目录文件 -t 查看静态库中有哪些目标文件 -d 从静态库中删除目标文件 -x 把静态库展开为目标文件 2、使用静态库

直接调用

把共享库当作目标文件一样,与调用者的目标文件一起合并出可执行文件。

gcc main.c libtools.a 通过gcc -L参数来指定库的路径 gcc main.c -L../tools/ -ltools 通过设置LIBRARY_PATH环境变量来指定库的路径 打开~/.bashrc文件 vim ~/.bashrc在末尾添加:export LIBRARY_PATH=$LIBRARY_PATH":/home/zhizhen/tools/"保存退出后,执行:source ~/.bashrcgcc main.c -ltools 需要通过-l来指定库名 四、共享库的创建和使用

1、创建共享库 编辑静态库原码:vim .c/.h 编译出目标文件:gcc -c -fpic xxx.c -> xxx.o 把目标文件打包成共享库:gcc -shared x1.o x2.o … -o libxxx.so -fpic编译出位置无关代码,在代码中使用相对地址,这样共享库就可以遇到内存的任何位置。 2、使用共享库 1、直接调用

gcc main.c libcalc.so

注意: 需要设置共享的加载路径,LD_LIBRARY_PATH 2、通过设置LIBRARY_PATH环境变量来指定库的路径 gcc main.c -lcalc 需要通过-l来指定库名 注意: 如果静态库和共享库同时存在,优先使用共享库,通过-static可以指定使用静态库。 3、通过gcc -L参数来指定库的路径

gcc main.c -L./calc/ -lclac

4、动态加载共享库

#include void *dlopen(const char *filename, int flag); 功能:打开共享库 filename:共享库的路径 flag:打开方式 RTLD_LAZY:延迟加载,使用到共享库时再加载 RTLD_NOW:立即加载 返回值:成功返回共享库的句柄,失败返回NULL void *dlsym(void *handle, const char *symbol); 功能:通过函数名在共享库中获取函数指针 handle:共享库的句柄 symbol:函数名 返回值:函数地址,失败返回NULL char *dlerror(void); 功能:获取错误信息 int dlclose(void *handle); 功能:卸载共享库 注意:编译时添加-ldl参数

七、辅助工具 nm: 查看目标文件、可执行文件、静态库、共享库文件的符号列表。 ldd: 查看可执行文件依赖了哪些共享库 strip: 删除目标文件、可执行文件、静态库、共享库文件中符号列表、调试信息,可以有效降低文件的大小。 objdump: 可以显示二进制文件的汇编信息

八、错误处理 1、通过函数返回值表式错误 1、返回值合法表示成功,非法表示失败。 2、返回有效指针表示成功,返回NULL/0xFFFFFFFF 表示失败。 3、成功返回0,失败返回-1。 4、永远成功,如:printf

九、环境变量表 每个程序执行时都收到一张操作系统传递给的环境变量表,方便该程序了解当系统的环境配置,env命令可以在终端查看环境变量表。

环境变量表是一个以NULL结尾的字符指针数数组。 该表是系统环境变量的拷贝,程序对当前这张进行修改,并不影响操作系统。

char *getenv(const char *name); 功能:根据环境变量名获取环境变量的值 int putenv(char *string); 功能:name=value向环境变量表中添加环境变量,环境变量不存在则添加,存在则修改。 返回值:0表示成功,非零表示失败 注意:不会把字符串拷贝到环境变量表中,而是把字符串地址存储到数组中。 int setenv(const char *name, const char *value, int overwrite); 功能:以name,value的形式向环境变量表添加环境变量,如果环境变量不存在则直接添加,如果存在则根据overwrite参数进行修改。 overwrite: 零 环境变量已经存在则不修改 非零 功能相当于putenv 返回值:0表示成功,非零表示失败 int unsetenv(const char *name); 功能:删除环境变量 返回值:0表示成功,非零表示失败 int clearenv(void); 功能:清空环境变量


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3