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的库。
有关每条命令的手册页上均提供更多详细信息。
以下是使用共享库的应用程序示例。
Program.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__;
}
bar.h
#ifndef BAR_H
#define BAR_H
#include <string>
std::string func_bar();
#endif
bar.cc
#include "bar.h"
std::string func_bar()
{
return __func__;
}
使用libfoo.so作为共享库进行构建。
克++ -Wall -Wextra -fPIC -shared foo.cc -o libfoo.so
克++ -lfoo -L./ -Wall -Wextra program.cc foo.h中-o程序
LDD程序
...
libfoo.so =>未找到
更新/etc/ld.so.cache中
须藤LDCONFIG /家庭/托比亚斯/项目/株/所以/
LDD表明动态链接器找到libfoo.so
ldd程序
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so(0x00007f0bb9f15000)
添加调用libbar.so在libfoo.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
克++ -Wall -Wextra -fPIC -shared bar.cc -o libbar.so
克++ -Wall -Wextra -fPIC -shared libbar.so FOO .cc -o libfoo.so
ldd libfoo.so
...
libbar.so =>没有发现
LDD程序
...
libfoo.so => /home/tobias/projects/stubs/so/libfoo.so(0x00007f49236c7000)
libbar.so =>没有发现
这表明,动态链接器还发现libfoo.so但不libbar的。所以
再次更新/etc/ld.so.cache并重新检查。
须藤LDCONFIG /家庭/托比亚斯/项目/株/所以/
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 => /首页/托比亚斯/项目/存根/ so/libbar.so(0x00007f2be4d0e000)
B找到了libfoo.so和libbar.so。
注意这最后一步对应用程序没有影响。 如果你真的严格的运行ldconfig是一种重新链接。 奇怪或不连接器需要知道它链接的库的依赖关系。 还有很多其他的方法来实现这一点,但这是选择。
你能发布一个最小化的配置来重现问题吗? Vitaut在他的帖子后的评论似乎描述了同样的过程,并没有达到同样的问题。也许如果你采取简单的步骤,我们可以帮助回答这个问题? – 2010-11-05 20:29:35