如何部署共享库?

How to deploy a shared library?

我想 "quickly" 在我的 Ubuntu 上部署一个共享库。这是一个短期项目,所以我不想在这里使用自动工具,而是手动完成所有操作。

所以我用这个建立了我的图书馆:

%.o: %.c
    $(CC) -fPIC -c $(CFLAGS) -o $@ $< -MMD -MF $(@:.o=.d)

lib%.so: %.o | dist
    $(CC) -shared -o dist/$@ $^

dist:
    mkdir -p dist

install: lib
    mkdir -p $(PREFIX)/lib/foobar
    mkdir -p $(PREFIX)/include/foobar
    cp dist/*.so $(PREFIX)/lib/foobar
    cp dist/*.h $(PREFIX)/include/foobar
    ldconfig $(PREFIX)/lib/foobar/

在另一个项目中,我想使用 libfoo.so 现在位于 /usr/lib/foobar/libfoo.so。所以我用以下方法构建了它:

$(CC) test.c -lfoo 

不幸的是我遇到了这个问题:

/usr/bin/ld: cannot find -lfoo

我现在可以 -L/usr/lib/foobar/libfoo.so 但我的操作系统应该知道这个位置。

我是否被迫直接将其放入/usr/lib?我对 /usr/local/lib 有同样的问题,它似乎不是与 gcc ... -l...

一起使用的默认路由

通常应该如何部署共享库?

使目录为动态链接器 (ld.so) 所知,以便可以在 运行-time 找到它而不依赖于 LD_LIBRARY_PATH:

  • 将它列在 /etc/ld.so.conf 中(或者在 /etc/ld.so.conf.d 下的包含文件中,如果主 /etc/ld.so.conf 文件有适当的 include 语句来启用它)
  • 然后 运行 /sbin/ldconfig

关于 build-time 链接器 (ld),通常需要使用 -L 显式指定库位置编译器上的标志,通常以目录作为参数,例如-L/usr/lib/foobar。然而,根据编译时链接器的手册页 ld,库的搜索路径确实包含(在其他所有内容之后)由 /etc/ld.so.conf 引用的目录。因此,尽管 ld.so.conf 顾名思义主要用于 运行-time 链接器,但构建时链接器实际上会在您列出目录后找到您的库。

来自 ld.so.conf 的目录列表具有系统范围的影响;运行时链接器将在启动 any 动态二进制文件时搜索这些目录。除非你真的想要额外的系统范围的开销,否则 私下 在自定义/需要的基础上搜索另一个目录会更有效。私人搜索非常适合一次性或一次性使用或很少使用的自定义库的情况。

对于引用这些库的 1 个或少数 bin,可以使用运行时链接器的指令重建 bin,以私下搜索 1+ 个自定义目录;例如:

gcc -L/usr/local/lib64 -Wl,-rpath=/usr/local/lib64 -lblah

有关详细信息,请参阅 gccld 相应选项 -Wl,-rpath 的手册页。