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