gpt4 book ai didi

c - 为什么重新定义一个已经存在于动态或静态库中的函数不会抛出任何错误?

转载 作者:太空狗 更新时间:2023-10-29 15:26:36 26 4
gpt4 key购买 nike

为什么重新定义动态库中已经存在的函数不会抛出任何编译和链接错误?

在下面的函数中

#include "calc_mean.h"
#include <stdio.h>

int mean(int t, int v) {
return 0;
}

int main () {
int theMean = mean(3,6);
printf("\n %d\n",theMean);
}

在共享库中,均值函数的定义已经存在,如下所示。

#include <stdio.h>
#include "calc_mean.h"

int mean(int a, int b) {
return (a+b)/2;
}

均值函数的定义已经存在于共享库 libmean.so 中。但是在编译期间我没有看到任何重定义错误并且编译成功。

成功执行后,我看到的 o/p 是 0 而不是 4,因此共享库中 mean 的函数定义没有被执行,但主模块中的函数定义被执行。

为什么会这样?

最佳答案

如果在编译/链接过程中尚未找到函数,则链接器仅链接库中的函数。

功能不同的原因是符号类型不同。库函数是一个弱符号。只有在尚未定义时才会包含它。 nm 是一种用于列出对象或可执行文件中符号的工具。在其man-page您可以找到符号类型的列表。

weak symbols 上还有一个维基百科页面.

关于c - 为什么重新定义一个已经存在于动态或静态库中的函数不会抛出任何错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com