程序目录如下:
其中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不一样,在此记录下。