如何部署一个共享库?

问题描述 投票:0回答:2

我想在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...

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

linux gcc shared-libraries
2个回答
2
投票

目录列表来自 ld.so.conf 对整个系统有影响;运行时链接器将在启动时搜索这些目录。任何 动态二进制。 除非你真的想要额外的系统范围内的开销,否则更有效的方法是使用 私下 在需要的基础上搜索另一个目录。 Private-search 非常适用于一次性或一次性使用或很少使用的自定义库的情况。

对于引用这些库的1个或少数几个库,可以通过运行时链接器的指令来重建库。私下 搜索1个以上的自定义目录; 例如

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

更多细节,请看 gccld 各个选项的手册页面 -Wl,-rpath.


1
投票

要让动态链接器知道一个目录(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 主要是为了配合运行时链接器使用,顾名思义,只要你把目录列在那里,构建时链接器其实就会找到你的库。

© www.soinside.com 2019 - 2024. All rights reserved.