【博客150】为什么引入库头文件就可以使用库函数而不需要与库函数c文件一起链接

内容: 实习的时候导师曾经问到过你知道为啥你的printf可以直接使用吗?你不需要将它的实现c文件一起链接也可以使用,甚至你不包含stdio.h文件也可以使用,引起了我对以前学习的动态库知识的回忆!

演示c文件:不包含stdio.h (包含的就不用演示啦,都是这么写的哈哈)

int main()
{
    printf("hello !");
    return 0;
}

在这里插入图片描述
结果: 可以看到也是可以执行成功的,但是提示的错误原因是没有看到函数声明,但是是警告,不是错误。

思考: 那么为什么你可以直接去使用一个你没有声明也没有定义的函数呢?

回答: 因为这个函数在我们lib动态库中,动态库中有这个内容,而且系统动态库已经被载入内存了

验证: ldd a.out
在这里插入图片描述
可以看到我们a.out依赖了三个库,所以其实printf的实现是在库里,我们运行的时候再加载的,这三个库是libc库,里面有常见库函数的实现。

使用nm指令验证是否在库里: nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep printf

在这里插入图片描述
可以看到有很多个printf的实现,类似c++的重载,库中的printf也有很多的种类

大四学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。

发布了158 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/103575896