如何部署共享库?



我想在我的 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/

在另一个项目中,我想使用现在位于/usr/lib/foobar/libfoo.solibfoo.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.conf中的目录列表具有系统范围的影响;运行时链接器将在启动任何动态二进制文件时搜索这些目录。 除非您确实想要额外的系统范围开销,否则在自定义/按需的基础上私下搜索另一个目录会更有效。 私人搜索非常适合一次性或一次性使用或很少使用的自定义库的情况。

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

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

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

要使动态链接器(ld.so(知道一个目录,以便在运行时可以找到它而不依赖于LD_LIBRARY_PATH

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

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

最新更新