我想在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.conf
对整个系统有影响;运行时链接器将在启动时搜索这些目录。任何 动态二进制。 除非你真的想要额外的系统范围内的开销,否则更有效的方法是使用 私下 在需要的基础上搜索另一个目录。 Private-search 非常适用于一次性或一次性使用或很少使用的自定义库的情况。
对于引用这些库的1个或少数几个库,可以通过运行时链接器的指令来重建库。私下 搜索1个以上的自定义目录; 例如
gcc -L/usr/local/lib64 -Wl,-rpath=/usr/local/lib64 -lblah
更多细节,请看 gcc
和 ld
各个选项的手册页面 -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
主要是为了配合运行时链接器使用,顾名思义,只要你把目录列在那里,构建时链接器其实就会找到你的库。