zoukankan      html  css  js  c++  java
  • linux动态链接库的使用

    linux动态链接库的使用

    文件结构

    目录结构

    pwd
    /home/virgil/Desktop/shared_object
    tree
    .
    ├── lib
    │   └── add.c
    └── main
        └── main.c
    

    add.c

    int add(int a,int b)
    {
    	return a+b;
    }
    

    main.c

    #include <stdio.h>
    //声明要调用库中的函数
    int add(int a,int b);
    
    int main()
    {
    	printf("%d
    ",add(1,2));
    	return 0;
    }
    

    编译动态库

    进入lib目录

    gcc add.c -fPIC -shared -o libadd.so 
    

    编译源代码

    进入main目录

    gcc main.c -o a.out -ladd
    

    这时编译会报错,提示找不到动态链接库add

    那么可以手动通过-L参数给出add动态链接库的路径

    gcc main.c -o a.out -l add -L ../lib/
    

    如果每次都需要指明路径未免太麻烦了,实际上gcc默认会有一个默认搜索路径,它会首先在该路径中进行搜索,该路径通常是/lib 或者/usr/lib目录.

    那么我就把libadd.so拷贝到该目录下即可

    sudo cp ../lib/libadd.so /usr/lib
    

    更常用的方法是使用软链接的方式,这样更新libadd.so时就无需重复拷贝

    cd /usr/lib
    ln -s /home/virgil/Desktop/shared_object/lib/libadd.so
    

    重新编译,就成功了

    gcc main.c -o a.out -ladd
    

    另外,除了手动在gcc参数中指明路径外还可以通过环境变量的方式来指出路径(绝对路径)

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/virgil/Desktop/shared_object/lib
    

    如果不想每次都要export

    可以在 ~/.bashrc 或者 ~/.bash_profile 中添加下面的命令

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/virgil/Desktop/shared_object/lib
    

    遇到问题

    1. 尝试修改/etc/ld.so.conf.d文件夹中的conf文件来指明路径,仍然提示找不到该库

      ld.so.conf是运行时的动态链接,与编译时的链接动作无关,所以修改里面的conf文件是无法让gcc找到所需的库的

      参考

    参考链接

    编译的各个阶段简介,gcc链接操作

    设置搜索库路径的方法,注意修改ld.so.conf不可取

  • 相关阅读:
    在Servlet中使用JSON
    Servlet中Web.xml的配置详解
    项目人力资源管理的思考
    CRLF和LF
    Linux 时区变化
    开始 space viking 之旅
    HTML的标签canvas
    问题解决了——在虚拟机上测试串口软件 您会收到错误数据
    Very Deep Convolutional Networks for Large-Scale Image Recognition
    MapReduce的InputFormat学习过程
  • 原文地址:https://www.cnblogs.com/virgildevil/p/12239642.html
Copyright © 2011-2022 走看看