【问题标题】:Build for shared library without a .so file为没有 .so 文件的共享库构建
【发布时间】:2016-10-26 15:58:22
【问题描述】:

我正在编译调用共享库的 C 源代码,并且在构建机器上只有库头,而不是 .so 文件(不同的 cpu 架构)。如何让代码在运行时找到并加载 /usr/lib/libx.so?

【问题讨论】:

  • 将您的 lib 目录添加到 LD_LIBRARY_PATH。
  • 如果您使用dlopen,它将自动搜索/lib/usr/lib(按此顺序)。
  • 我是否也可以调用 dlsym,或者使用原始符号名称并使用 -Wl,--unresolved-symbols=ignore-in-object-files 构建?

标签: c gcc linker shared-libraries ld


【解决方案1】:

根据 LD_LIBRARY_PATH 的原始建议进行了修订。

假设您使用的是 linux 系统,共享库可能会在执行开始之前通过 LD_PRELOAD 环境变量加载:

$ LD_PRELOAD="/usr/lib/libx.so" your_app

但是,与-Wl,--unresolved-symbols=ignore-in-object-files 链接可能不是一个好习惯。我建议使用dlsym 从动态库中加载任意符号。例如,

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main ()
{
   void *handle;
   void (*foo_fp) (void);  // function signature from dynamic library

   // Dynamically load libfoo.so, searching it from LD_LIBRARY_PATH
   handle = dlopen ("libfoo.so", RTLD_LAZY);

   // Load function 'foo' from libfoo.so
   foo_fp = dlsym(handle, "foo");

   // Calls 'foo' from libfoo.so
   foo_fp();
   return 0;
}

编译这个:

gcc -o main main.c -ldl

执行:

export LD_LIBRARY_PATH=<location of libfoo.so>
./main

【讨论】:

  • 不起作用;可能是因为它是在没有 -l* 的情况下构建的
  • 您能说明一下您是如何构建可执行文件的吗?此参考资料也可能对您有所帮助:cprogramming.com/tutorial/shared-libraries-linux-gcc.html
  • gcc -o app src.c -Wl,--unresolved-symbols=ignore-in-object-files
  • 试试:LD_PRELOAD=/usr/lib/libx.so; ./app
  • 有效!但分号不是必需的。现在,如果我能在构建时获得相同的效果...
【解决方案2】:

创建一个导出所需符号的“虚拟”libx.so 文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多