如何部署共享库?
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
有关详细信息,请参阅 gcc
和 ld
相应选项 -Wl,
和 -rpath
的手册页。
我想 "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
有关详细信息,请参阅 gcc
和 ld
相应选项 -Wl,
和 -rpath
的手册页。