【问题标题】:how can I link a shared object in C?如何在 C 中链接共享对象?
【发布时间】:2011-12-16 18:33:23
【问题描述】:

我做了一个使用共享对象的简单程序,用dlopen() 打开它。我还编译并链接了共享对象,如下所示:

gcc -o libmylib.so libmylib.c -shared -fPIC -Wall

gcc -o program program.c -L. -lmylib -ldl -Wall

当我第一次尝试运行该程序时,它会说类似

cannot open libmylib.so: no such file or directory

所以我搜索了互联网,发现我必须将我的共享对象复制到/lib/i386-linux-gnu/ 才能运行程序。所以我这样做了,它奏效了,但后来我尝试以其他方式做到这一点,因此我从/lib/i3686-linux-gnu/ 目录中删除了libmylib.so。现在,当我尝试运行该程序时,它没有显示任何错误,但一直说Segmentation fault。共享对象明明是找不到了,但是不复制怎么链接呢?

我使用的是 Ubuntu 11.10

【问题讨论】:

  • 如果您以 root 身份运行 ldconfig,分段错误会消失吗?

标签: linux gcc linker shared-libraries


【解决方案1】:

详细了解shared libraries 及其search paths,以及ld 命令。

另一种方法是注册用于搜索库的“运行时”路径。你可以使用gcc -Wl,-rpath . -o program program.c -L. -lmylib -ldl -Wall

如果你的程序在运行时是dlopen-ing 一些*.so 文件,你最好将绝对文件名传递给dlopen(或类似"./foo.so")。 realpath 函数可以帮助您。

甚至还有一个命令chrpath(我刚刚发现)可用于现有可执行文件以更改其运行路径。

出于安全原因(类似于PATH 的原因)以避免将当前目录放在运行时路径或LD_LIBRARY_PATH 中。

【讨论】:

    【解决方案2】:

    当你编译程序时,你正确地链接了它;使用-L. -lmylib。但是,如果它不是标准系统库,则执行环境需要知道在哪里查找它。一种方法是使用环境变量LD_LIBRARY_PATH,如下所示:

    LD_LIBRARY_PATH=. ./program
    

    export LD_LIBRARY_PATH=.
    ./program
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多