zoukankan      html  css  js  c++  java
  • Linux Linux共享库

    so文件在linux中为共享库,与windows下的dll类似。
    so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用。
    共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以。
    注意:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。
    so文件编译方法
    --so文件的源文件中不需要main函数,即使有也不会被执行。
    --编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码。
      在操作系统中,执行一个进程的时候,会将这个进程的代码加载到内存,系统为这段程序分配一个入口地址(一般就是main函数的地址),
      这个程序中的其他函数的地址都是相对地址(相对于入口地址),所以在进程中,只有程序的入口地址是绝对地址,其他函数的地址都是相对  
      地址,对于so共享库文件,在编译的时候不需要给so文件相对地址,因为so文件没有入口地址,它是用来被其他进程调用的
    --链接的时候gcc使用-shared选项,指示生成一个共享库文件。
    --共享库文件名要以lib开头,扩展名为.so。

    so文件使用方法
    --为了让Linux能找到so文件的位置,需要在.bash_profile中添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
      因为linux默认不在当前目录下寻找可执行文件,so也是可执行文件,所以so文件也需要配置环境变量,增加在本地查找。
    --或者将so文件放入linux系统目录/user/lib(不建议这么做)
    --在c文件中使用so文件,首先需要#include相关的.h文件。
    --gcc链接时添加 -L参数指明so文件存放路径,-l(L)参数执行so文件名
      以libtest.so文件在当前路径下举例: gcc -L. -ltest -o a a.o
      其中-L.意思是在当前路径下寻找so文件
      -ltest意思为要链接libtest.so这个库文件
      -o a意思是编译后可执行文件名为a
    当我们在cpp文件中包含test.h文件,用g++连接libtest.so这个库会报错
    为了使我们编写的so文件同事可以被c或者c++调用,我们需要修改一下h文件中的函数声明部分。
    增加带有__cplusplus(两个下划线)的预编译指令。
    __cplusplus(两个下划线)是c++编译器预定义的一个宏,比如用g++的时候这个宏就被提前定义了。
    extern "C"  extern这个是c++下的关键字,C语言没有这个关键字,表示这是一个C语言函数
    --注意:"C"这个字符是大写

    在动态链接库中查找某一个函数是否存在以及函数入口地址:
    假设动态链接库为yourLib.so,函数名字为yourFunction,则如下:

    nm -D yourLib.so |grep -w yourFunction
  • 相关阅读:
    Java多线程初学者指南(5):join方法的使用
    Java多线程初学者指南(4):线程的生命周期
    使用Runnable接口创建线程-3
    用Thread类创建线程-2
    线程简介-1
    Struts, Namespace用法
    多线程编程
    算法实例
    java 堆与栈的区别
    Spring AOP EXPRESSION
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5820121.html
Copyright © 2011-2022 走看看