在 Fedora 上,动态链接由 ld-linux.so.2 执行。动态链接器使用 /etc/ld.so.cache 和 /etc/ld.so.preload 来查找库文件。
运行 ldconfig 告诉系统 libfoo 应该在哪里寻找 libbar。
ldconfig 查找 /lib、/usr/lib 和 /etc/ld.so.conf 中列出的任何目录。您可以使用 ldd 检查程序使用哪些库。
每个命令的手册页上提供了更多详细信息。
这是一个使用共享库的应用程序示例。
程序.cc
#include "foo.h"
#include <iostream>
int main(int argc, char *argv[])
{
for (int i = 0; i < argc; ++i) {
std::cout << func_foo(argv[i]) << std::endl;
}
}
foo.h
#ifndef FOO_H
#define FOO_H
#include <string>
std::string func_foo(std::string const &);
#endif
foo.cc
#include "foo.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__;
}
酒吧.h
#ifndef BAR_H
#define BAR_H
#include <string>
std::string func_bar();
#endif
酒吧.cc
#include "bar.h"
std::string func_bar()
{
return __func__;
}
使用 libfoo.so 作为共享库进行构建。
g++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
g++ -lfoo -L./ -Wall -Wextra program.cc foo.h -o program
ldd program
...
libfoo.so => not found
更新 /etc/ld.so.cache
sudo ldconfig /home/tobias/projects/stubs/so/
ldd 显示动态链接器找到 libfoo.so
ldd 程序
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f0bb9f15000)
在 libfoo.so 中添加对 libbar.so 的调用
新建 foo.cc
#include "foo.h"
#include "bar.h"
std::string func_foo(std::string const &arg)
{
return arg + "|" + __func__ + "|" + func_bar();
}
构建 libbar.so 并重新构建 libfoo.so
g++ -Wall -Wextra -fPIC -shared bar.cc -o libbar.so
g++ -Wall -Wextra -fPIC -shared libbar.so foo.cc -o libfoo.so
ldd libfoo.so
...
libbar.so => 未找到
ldd program
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f49236c7000)
libbar.so => not found
这表明动态链接器仍然找到 libfoo.so 而不是 libbar.so
再次更新 /etc/ld.so.cache 并重新检查。
sudo ldconfig /home/tobias/projects/stubs/so/
ldd libfoo.so
...
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f935e0bd000)
ldd 程序
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so (0x00007f2be4f11000)
libbar.so => /home/tobias/projects/stubs/so/libbar.so (0x00007f2be4d0e000)
libfoo.so 和 libbar.so 都找到了。
请注意,最后一步对应用程序没有影响。如果你真的很严格,运行 ldconfig 是一种重新链接。链接器是否奇怪需要知道它链接的库的依赖关系。有很多其他方法可以实现这一点,但选择了这个。