• Linux 动态链接库和静态库示例


    文件预览

    文件目录树如下,如你所见,非常简单。

    • libtest/  
    • |-- lt.c  
    • |-- lt.h  
    • `-- test.c  

    代码

    #lt.c

    • /* lt.c 
    •  * 
    •  */  
    •   
    • #include <stdio.h>  
    •   
    • void myprint(void)  
    • {  
    •   printf("Linux library test!\n");  
    • }  



    # lt.h

    • /* lt.h 
    •  *  
    •  */  
    •   
    • void myprint(void);  



    #test.c

    • /* test.c 
    •  * 
    •  */  
    •   
    • #include "lt.h"  
    •   
    • int main(void)  
    • {  
    •   myprint();  
    •   return 0;  
    • }  

    先看静态库

    首先做成静态库 liblt.a 。

    • $ gcc -c lt.c -o lt.o  
    • $ ar cqs liblt.a lt.o  




    再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。

    • $ gcc test.c liblt.a -o test  



    这个时候再来看他的引用库情况。

    • $ ldd test                                            //ldd  是用来查看链接那些动态链接库
    •         linux-gate.so.1 =>  (0xffffe000)  
    •         libc.so.6 => /lib/libc.so.6 (0xb7e29000)  
    •         /lib/ld-linux.so.2 (0xb7f6e000)  

    动态库

    做成动态库 liblt.so 。

    • $ gcc -c lt.c -o lt.o  
    • $ gcc -shared -Wall -fPIC lt.o -o liblt.so  



    链接方法I,拷贝到系统库里再链接,让gcc自己查找

    • $ sudo cp liblt.so /usr/lib  
    • $ gcc -o test test.o -llt  


    这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
    lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

    链接方法II,手动指定库路径

    • $ cc -o test test.o -llt -B /path/to/lib


    这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
    中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
    统变量 LD_LIBRARY_PATH :

    • $ export LD_LIBRARY_PATH=/path/to/lib  



    这个时候再来检测一下test程序的库链接状况(方法I情况)

    • $ ldd test  
    •         linux-gate.so.1 =>  (0xffffe000)  
    •         liblt.so => /usr/lib/liblt.so (0xb7f58000)  
    •         libc.so.6 => /lib/libc.so.6 (0xb7e28000)  
    •         /lib/ld-linux.so.2 (0xb7f6f000)  


    恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

    学习 交流 进步 未来
  • 相关阅读:
    未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
    .net remoting 尝试
    上传图片时获取所传图片大小
    图象处理算法(二)
    对CollapablePanel控件的改进
    一个简单的网页计数器
    ValidateBox控件使用Ajax改进
    图象处理算法(四)
    常用技巧(一)
    在Asp.Net里使用自定义映射进行重定向
  • 原文地址:https://www.cnblogs.com/changefuture/p/2297460.html
Copyright © 2020-2023  润新知