这个问题与编译和动态链接期间查找库的方式有关。
考虑这个小项目:
- 项目
- 利巴
- 一个.hpp
- a.cpp
- 库
- b.hpp
- b.cpp
- 主文件
- 利巴
a.hpp:
int AAA();
一个.cpp:
#include <b.hpp>
int AAA()
{
return BBB();
}
b.hpp:
int BBB();
b.cpp:
int BBB()
{
return 3;
}
主.cpp:
#include "liba/a.hpp"
#include "libb/b.hpp"
int main()
{
AAA();
BBB();
}
libb 编译为:
光盘库;g++ -shared -o libb.so b.cpp
liba 编译为:
光盘库;g++ -I../libb/ -L../libb/ -lb -shared -o liba.so -Wl,-rpath /full/path/to/project/libb/ a.cpp
和 main 编译:
g++ -Lliba -la -Wl,-rpath /full/path/to/project/liba/main.cpp
编译完成没有错误,但是执行a.out时,找不到libb.so。
ldd 输出:
ldd ./a.out
linux-gate.so.1 => (0xffffe000)
liba.so => /full/path/to/project/liba/liba.so (0xb780a000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76ba000)
libm.so.6 => /lib/libm.so.6 (0xb7692000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7672000)
libc.so.6 => /lib/libc.so.6 (0xb750f000)
libb.so => not found
libb.so => /full/path/to/project/libb/libb.so (0xb750c000)
/lib/ld-linux.so.2 (0xb780e000)
请注意, libb.so 出现两次。有一次,动态链接器找不到库,有一次是。我假设,在第二种情况下,它使用嵌入在 liba.so 中的 rpath。
当然,有多种方法可以解决这个问题(例如 LD_LIBRARY_PATH,在编译 main.cpp 时嵌入正确的 rpath ...),但我更感兴趣的是为什么 main.cpp 的编译有效,而动态链接却没有不。
到目前为止,我假设使用相同的过程来搜索所需的库。是我遗漏了什么,还是一些我不知道的隐藏魔法?:)
(在带有 gcc 4.3.4 的 SLED11 盒子上进行了测试。)