背景

有两个库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