windows在编译动态库的时候,引用的函数一定需要知道在哪个库里面;linux没这个限制。
下面介绍我们的目录:
其中libcalladd.so是由calladd.c编译出,calladd.c引用了函数add,而此函数在main.c里面定义。
main.c是主程序文件,调用了calladd库。
头文件add.h内容如下:
int add(int a, int b);
calladd.c的内容如下:
#include "add.h"
int calladd(int a, int b)
{
return add(a, b);
}
其中add函数定义在main.c里面,而main.c是主程序文件。
我们将calladd.c编译成动态库
gcc calladd.c -fPIC -shared -olibcalladd.so
我们在calladd动态库的时候,发现引用的函数add并未指定其所在库,但是依然能够编译通过,这在windows上是会出问题的,windows上会报符号找不到的链接错误。
现在看下主程序文件main.c
#include <stdio.h>
#include "add.h"
int add(int a, int b)
{
return (a + b);
}
extern int calladd(int a, int b);
int main()
{
int a = 2;
int b = 1;
int c;
c = calladd(a, b);
printf("the sum of %d and %d is %d\n", a, b, c);
return 0;
}
可以看出main.c里面调用库calladd的函数calladd,而calladd又调用了add函数。
通过下面的编译,calladd里面的引用函数add最终指向main.c。
gcc main.c -L. -lcalladd
linux里面的函数默认是导出的,在编译main.c时,如果设置函数不导出。
gcc main.c -fvisibility=hidden -L. -lcalladd
则会报链接错误,如下所示: