是否可以链接到共享库而无需访问库本身?

Geo*_*lly 4 linux linker shared-libraries elf ld

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

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

如果没有,共享库包含哪些不在头文件中的信息?

Emp*_*ian 5

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

编译:是的。链接:也许吧。

您可以创建一个虚拟库来链接。例如,如果标题包含:

int library_func(void*);
Run Code Online (Sandbox Code Playgroud)

然后:

// 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.
Run Code Online (Sandbox Code Playgroud)

有一些问题:

  1. 真正的图书馆可能有(例如)SONAME以外的东西。如果不访问真实的内容,您就无法知道。libfoo.solibfoo.so.2libfoo
  2. 真正的库可以使用版本化符号。如果您将您的程序链接到虚拟库,它将使用所有引用符号的默认版本,这现在可能是正确的,但将来可能会中断(如果/当真实库更新为新的和不兼容的您调用的任何符号的实现)。

  • 我找到了一个更简单但不太健壮的解决方案:使用 clang 创建一个空库:`echo "" | clang++ -shared -fPIC -x c++ - -o libfoo.so` 并告诉 `clang / ld` 在链接时忽略未解析的符号:`-Wl,--unresolved-symbols=ignore-in-object-files`。 (3认同)