zoukankan      html  css  js  c++  java
  • (原)g++编译后运行时无法链接动态库的解决方法

    g++编译后运行时无法链接动态库的解决方法:


    问题发现:

    $ g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicrohttpd -ldl

    $ ./hellobrowser.exec

    error while loading shared libraries: libmicrohttpd.so.10: cannot open shared object file: No such file or directory

    $ whereis libmicrohttpd

    发现/usr/local/lib下有这个库

    $ cd /usr/local/lib

    $ find libmicrohttpd.so.10

    的确有这个文件。

    这是因为动态库默认只会在/usr/lib下找。不会去/usr/local/lib找。


    解决方法:

    1sudo vi /etc/ld.so.conf

    添加一行:

    /usr/local/lib

    然后sudo ldconfig使得生效。这样动态库就会去/usr/local/lib找了。

    2

    g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicrohttpd -ldl -Wl,-R /usr/local/lib

     

    法3:
    $ ln -s /usr/local/lib/libmicrohttpd.so.10 /usr/lib/libmicrohttpd.so.10
    # ln -s /usr/local/lib/libmicrohttpd.so /usr/lib/libmicrohttpd.so


    推荐法1和法2.


    分析解释:

    默认情况下,编译器只会使用/lib/usr/lib这两个目录下的库文件

    虽然g++ -L/usr/local/lib虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这个库路径加上-Wl,-R,即添加g++参数“-Wl,-R 动态库库路径”。


    或者修改系统文件/etc/ld.so.conf这个文件记录了编译时使用的动态链接库的路径。


    补充@20170417:

    如果我要指定链接一个具体路径下的库,可以这样(就不要-l了):

    g++ <其它的编译参数,源文件,略> libx.so

     

  • 相关阅读:
    node.js 基础篇
    node.js 开发环境搭建
    Velocity VelocityEngine 支持多种loader 乱码问题
    tomcat集群及session共享
    上海支付宝终面后等了两周,没能收到offer却来了杭州淘宝的电话面试
    支付宝hr终面,忐忑的等待结果
    mysql 数据范围总结
    rsync同步文件(多台机器同步代码...)
    linux基础命令
    路飞学城项目之前后端交互,跨域问题
  • 原文地址:https://www.cnblogs.com/xiaouisme/p/2516495.html
Copyright © 2011-2022 走看看