关于动态库编译依赖问题

一、有如下代码结构

$ tree
.
├── inclde
│   ├── lib_A.h
│   └── lib_B.h
├── main.c
└── src
    ├── lib_A.c
    └── lib_B.c

2 directories, 5 files


其中,
1、lib_A.c 定义了 hw() 函数
2、lib_B.c 定义了 test1()、test2() 两个函数。
   - test1 函数实现简单打印
   - test2 函数实现调用 hw 函数
3、main.c:main函数调用 test1 函数

问题:当 lib_A.c、lib_B.c 分别编译出 libA.so、libB.so动态库。因为 main.c 没有用到 test2 函数,那么在编译 main.c 时是否需要依赖 ilbB.so 呢?

代码如下:

inclde/lib_A.h:

void hw();

 inclde/lib_B.h:

void test1();
void test2();

src/lib_A.c:

#include <stdio.h>

void hw()
{
    printf("hello world\n");
}

src/lib_B.c:

#include <stdio.h>
#include "lib_A.h"

void test1()
{
    printf("test1 in\n");
    printf("test1 out\n");
}

void test2()
{
    printf("test2 in\n");
    hw();
    printf("test2 in\n");
}

main.c:

#include <stdio.h>
#include "lib_B.h"

int main(void)
{
    test1();

    return 0;
}

二、开始编译

1、第一种情况:编译libB.so 时没有链接 -lA。在编译 main.c 时需要 -lA

$ gcc -fPIC -shared src/lib_A.c -o libA.so -I./inclde
$ gcc -fPIC -shared src/lib_B.c -o libB.so -I./inclde
$
$
$ gcc main.c -o main -I./inclde -L. -lB
./libB.so: undefined reference to `hw'
collect2: error: ld returned 1 exit status
$
$ gcc main.c -o main -I./inclde -L. -lB -lA
$
$ ./main
test1 in
test1 out
$

使用 ldd 查看库的依赖:libB.so 没有明确依赖 libA.so

$ ldd libB.so
        linux-vdso.so.1 =>  (0x00007ffd6112f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc887282000)
        /lib64/ld-linux-x86-64.so.2 (0x0000557f8a0cf000)
$
$ ldd main
        linux-vdso.so.1 =>  (0x00007ffc369fe000)
        libB.so (0x00007fdb113b3000)
        libA.so (0x00007fdb111b1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdb10dda000)
        /lib64/ld-linux-x86-64.so.2 (0x000055de38e70000)

2、第二种情况:编译libB.so 时链接了 -lA。在编译 main.c 时只需要链接 -lB, 不需要链接 -lA

$ gcc -fPIC -shared src/lib_A.c -o libA.so -I./inclde
$ gcc -fPIC -shared src/lib_B.c -o libB.so -I./inclde -L. -lA
$
$ gcc main.c -o main -I./inclde -L. -lB
$
$ ./main
test1 in
test1 out
$

使用 ldd 查看库的依赖:libB.so 明确依赖 libA.so

$ ldd libB.so
        linux-vdso.so.1 =>  (0x00007ffeedfe6000)
        libA.so (0x00007f972ad74000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f972a99d000)
        /lib64/ld-linux-x86-64.so.2 (0x000056363faca000)
$
$ ldd main
        linux-vdso.so.1 =>  (0x00007fffbf9fd000)
        libB.so (0x00007f90726aa000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f90722d3000)
        libA.so (0x00007f90720d1000)
        /lib64/ld-linux-x86-64.so.2 (0x0000555a668d0000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值