背景
有两个库a和b, 库a.cpp
void aaa()
{
printf("aaaaaaaaaaaaaaaaaaaaaaa\n");
}
库b.cpp
void bbb()
{
aaa()
printf("bbbbbbbbbbbbbbbbbbb\n");
}
库b调用了库a的函数,b依赖a
main.cpp:
int main()
{
bbb();
return 0;
}
可执行文件调用了b库的函数
makefile:
all : liba.so libb.so c.out
liba.so : a.cpp
aarch64-linux-g++ -fPIC -rdynamic -shared a.cpp --o liba.so
libb.so : b.cpp
aarch64-linux-g++ -fPIC -rdynamic -shared b.cpp -o
c.out : c.cpp
aarch64-linux-g++ main.cpp -o c.out -L. -lb
依赖:main->b->a, main依赖b,b依赖a,但是在编译main时只链接了b,所以就会报错:
warning: liba.so, needed by ./libb.so, not found (ry using -rpath or -rpath-link)
./libb.so: undefined reference to `aaa()'
这是因为在链接b时发现b依赖a,所以就去找a,但是在库的查找路径中找不到a所以就报错了, 因为默认的库查找路径不包含当前路径,只有系统目录
解决方法
方法1,在编译main时把库a加上:
c.out : c.cpp
aarch64-linux-g++ main.cpp -o c.out -L. -lb -la
这种方案很麻烦,因为一个库可以加上,那如果有10个20库那就得加一堆
方法2,添加rpath-link选项:
c.out : c.cpp
aarch64-linux-g++ main.cpp -o c.out -Wl,-rpath=. -L. -lb -la
把当前路径加到rpath中,告诉链接时如果发了一个so需要别一个so,时就到rpath指定的目录去找
参考
using -rpath or -rpath-link What's the difference between -rpath-link and -L