linux主程序链接多个动态库时,若多个动态库之间存在相同的函数,则也正常调用

本文通过一个简单的C语言程序示例,展示了在Linux环境下如何通过改变链接库的加载顺序来选择不同行为的函数实现。文章详细记录了从源代码到编译、链接直至运行的全过程,并对比了Windows平台下的不同表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序目录如下:
在这里插入图片描述
其中a.out是可执行文件,由main.c生成,链接了libadd1.so和libadd2.so;
libadd1.so由add1.c编译生成;libadd2.so由add2.c编译生成。
add1.c的内容如下:

#include "add1.h"

int add(int a, int b)
{
	return (a + b);
}

add2.c 的内容如下,可以看出结果多加了一个2,以示区别

#include "add2.h"

int add(int a, int b)
{
	return (a + b + 2);
}

add1.h和add2.h的内容是一样的,如下所示:

int add(int a, int b);

main.c的内容如下:

#include "add1.h"
#include "add2.h"
#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int c;
	c = add(a, b);
	printf("the sum of %d and %d is %d\n", a, b, c);
	return 0;
}

先编译出两个动态库,如下所示:

gcc add1.c -fPIC -shared -olibadd1.so
gcc add2.c -fPIC -shared -olibadd2.so

再编译main.c,如下所示:

gcc main.c -L./ -ladd1 -ladd2

然后运行a.out,结果如下:
在这里插入图片描述
我们发现main里面调用的add来自于库libadd1.so。
接着编译main.c,此时将库add1和add2的顺序调换下,再执行a.out,结果如下:
在这里插入图片描述
我们发现main里面调用的add来自于库libadd2.so。

这种方式在windows上的vs编译器会在链接时报重复定义的错误,这点跟linux不一样,在此记录下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值