博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux下的动态库和静态库
阅读量:4054 次
发布时间:2019-05-25

本文共 1740 字,大约阅读时间需要 5 分钟。

1、使用GCC创建和使用静态库 

(1)gcc –o mylib.o –c mylib.c  //生成o文件

(2)ar -rcs libmylib.a mylib.o   //生成a文件
    -c create的意思
    -r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。
(3)cp libmylib.a /usr/lib/       //拷贝到默认目录
(4)编写程序使用库中的函数,需要包含相关的头文件,即可用下面的方式进行编译连接。
    gcc –o test test.c -L. -lmylib
    -L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。
    -l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。

2、使用GCC创建和使用动态库

(1)gcc –fPIC –o mylib.o –c mylib.c

    gcc –shared –o libtt.so mylib.o
    -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
    -shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述信息,去除共享库所不需的信息。
(2)也可以直接使用下面一条命令:
    gcc –fPIC –shared –o libtt.so mylib.c
(3)将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib,使用ldconfig命令加载
    cp libttt.so /usr/local/lib
(4) 编译src 程序使用动态库,隐式调用方法: 在编译调用库函数代码时指明动态库的位置及名字
    gcc –o test test.c  ./usr/lib/libttt.so
(5)编译src程序使用动态库,显示调用方法
     显式调用动态库需要四个函数的支持, 函数 dlopen 打开动态库, 函数 dlsym 获取动态库中对象基址, 函数 dlerror 获取显式动态库操作中的错误信息, 函数 doclose 关闭动态库.

#include <dlfcn.h> 
int main() 
                void *pHandle; 
                void (*pFunc)(); // 指向函数的指针 
                int *p; 
                pHandle = dlopen("./d1.so", RTLD_NOW); // 打开动态库 
                if(!pHandle){ 
                                printf("Can't find d1.so \n"); 
                                exit(1); 
                } 
                pFunc = (void (*)())dlsym(pHandle, "print"); // 获取库函数 print 的地址 
                if(pFunc) 
                                pFunc(); 
                else 
                                printf("Can't find function print\n"); 
                dlclose(pHandle); // 关闭动态库 
                return 0; 

    gcc –o test test.c -lttt -L

    此时会到系统目录下去搜素libttt.so文件,具体搜索方法见下一节。

3、shell 搜索路径位置的两种方法

    (1) 使用命令导入动态库的路径,命令如下:
    export LD_LIBRARY_PATH=dir (如/usr/local/lib)
    (2) 在/etc/ld.so.conf 文件中更增加一条,修改后用ldconfig 命令载入修改。

4、其他

(1)ldd命令可以查看一个可执行程序依赖的共享库,

    # ldd /bin/ln
    => /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
    => /lib/ld- linux.so.2 (0×40000000)
    可以看到ln命令依赖于libc库和ld-linux库

(2)看动态库包含哪些定义用:

     nm -D lib*.so

转载地址:http://rxoci.baihongyu.com/

你可能感兴趣的文章
数据库笔试题
查看>>
chances!I would let it go any more!
查看>>
何为程序员的理想生活方式
查看>>
大二你能做什么
查看>>
谈谈软件从业学习方向--同济大学软件学院JacksonWan
查看>>
Java中利用JMF编写摄像头拍照程序
查看>>
读《SQL Server2000》数据库设计与系统管理
查看>>
java23面试题
查看>>
大学生IT创业还有神话吗?
查看>>
Java技术的新方向
查看>>
Java的JDBC数据库连接池实现方法
查看>>
Struts + Spring + Hibernate 框架资源--整理
查看>>
创业实验室-第一堂课感想
查看>>
创业实验室-第二堂课感想
查看>>
软考-下个阶段征服对象
查看>>
非阻塞套接字(Nonblocking Sockets) 概述
查看>>
Java NIO API详解
查看>>
也许可以更power
查看>>
我来拉Eclipse
查看>>
自己编写的NIO非阻塞聊天室
查看>>