linux动态库引用函数说明

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

则会报链接错误,如下所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值