是否可以 link 访问共享库而不访问库本身?

Is it possible to link to a shared library without access to the library itself?

我有共享库的 header 个文件,但没有共享库及其源代码。

我还能针对这个库编译一些代码吗?

如果不是,共享库包含哪些不在 header 中的信息?

是的。您可以为它们声明指向函数的指针,然后调用 dlopendlsym,然后就可以了。但是,尝试以某种方式编造一个可执行文件或共享库,就好像您已经 linked 到该库一样是有风险的;有关详细信息,请参阅 Employed Russian 的回答。

当然,您将需要这些库本身来 运行 代码。

但是,请注意并非所有 'shared libs' 都是共享库。在某些情况下,除了 运行 时的 .so 之外,link 时还会使用 .a 文件来提供一些静态 linked 代码.这并不常见。

Can I still compile some code against this library?

编译:是的。 Link:也许吧。

您可以为 link 创建一个虚拟库。例如。如果 header 包含:

int library_func(void*);

然后:

// dummy_lib.c
int library_func(void *p) { return 0; }

gcc -fPIC -shared -o libfoo.so dummy_lib.c

# Now you can use libfoo.so to link your program.

有一些陷阱:

  1. 真正的图书馆可能有 SONAME 不同于 libfoo.so 的内容(例如 libfoo.so.2)。如果不访问真实的 libfoo.
  2. ,您将无法知道
  3. 真正的库可以使用版本化符号。如果您 link 您的程序针对虚拟库,它将使用所有引用符号的默认版本,这现在可能是正确的,但将来可能会崩溃(if/when 真正的库是使用您调用的任何符号的新 不兼容 实现进行了更新。