程序目录如下:
在这里插入图片描述
其中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不一样,在此记录下。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐