Linux动态库多重依赖,编译问题!!!!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux动态库多重依赖,编译问题!!!!!!相关的知识,希望对你有一定的参考价值。

①libb.so依赖liba.so;
②程序A依赖libb.bso;
编译程序A的时候为什么要指定liba.so啊?
有回避方法么?

① gcc -fPIC -shared -o libtest01.so test01.c
②gcc -fPIC -shared -o libtest02.so test02.c
③gcc -o test main.c -L./ -I./ -ltest02 -ltest01

不指定libtest01库,通不过诶…………

这只能说明一个问题,你依赖的库本身有问题,没有把它的依赖都加进去,也就是你例子中的①libb.so依赖liba.so;,你应该在生成libb.so的时候,把对liba.so的依赖加进去,这样应该就没有问题了。 参考技术A 肯定要都链接的,编译libb的时候无需关联liba,但是程序一旦用到libb,就必须同时链接a和b两个库。

Linux动态库多重依赖

源文件:

//world.cpp
#include <stdio.h>

void world(void)
{
    printf("world.\\n");
}
//hello.cpp
#include <stdio.h>

void world(void);

void hello(void)
{
    printf("hello\\n");
    world();
}
//test.cpp

void hello(void);

int main(void)
{
    hello();
    return 0;
}

 一、动态库多重依赖

(1)编译word动态库

g++ -shared -fPIC world.cpp -o libworld.so

(2)编译hello动态库

g++ -shared -fPIC hello.cpp -o libhello.so

ldd libhello.so

查看libhello.so的依赖库,没有看到依赖libword.so

g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworld

ldd libhello.so

再次查看libhello.so的依赖库,看到了依赖库libword.so

上图显示libworld.so not found,如果临时增加链接动态库的路径,输入如下命令

export LD_LIBRARY_PATH=./

ldd libhello.so

查看libhello.so的依赖库,显示了依赖库libword.so的路径

先清除链接动态库路径

export LD_LIBRARY_PATH=

(3)编译可执行文件test

g++ test.cpp -o a.out -L ./ -lhello

提示找不到libhello.so的依赖库libworld.so,即使编译libhello.so时已经指定了libworld.so,这点和windows不一样

g++ test.cpp -o a.out -L ./ -lhello -lworld -Wl,-rpath ./

编译通过,得到可执行文件a.out,运行成功

二、动态库静态库多重依赖

(1)编译word静态库

g++ -c world.cpp

ar -cr libworld.a world.o

(2)编译hello动态库

g++ -shared -fPIC hello.cpp -o libhello.so -L ./ -lworld

编译报错,因为world也必须使用-fPIC,重新编译

(3)编译可执行文件

g++ test.cpp -o a.out -L ./ -lhello -Wl,-rpath ./

三、静态库多重依赖

(1)编译world静态库

g++ -c world.cpp

ar -cr libworld.a world.o

(2)编译hello静态库

g++ -c hello.cpp

ar -cr libhello.a hello.o

(3)编译可执行文件

g++ test.cpp -o a.out -L ./ -lworld -lhello

因为静态库的依赖有顺序,被调用库应该放在调用库后面,动态库没有依赖顺序,正确输入如下

g++ test.cpp -o a.out -L ./ -lhello -lworld

 (4)静态库包含静态库

 

以上是关于Linux动态库多重依赖,编译问题!!!!!!的主要内容,如果未能解决你的问题,请参考以下文章

如何交叉编译 动态库

linux 下如何将动态链接库.so进行反编译后,换编译器重新编译?

Linux动态库多重依赖

在Linux PC上查看arm交叉编译的可执行文件依赖的动态库

linux下查看动态链接库so文件的依赖的相关组建

Linux程序编译链接动态库版本号的问题