为什么重新定义动态或静态库中已存在的函数不会引发任何错误?

Abh*_*hya 4 c linker-errors duplicate-symbol

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

在下面的功能

#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);
}
Run Code Online (Sandbox Code Playgroud)

共享库内部平均功能的定义已经如下所示.

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

int mean(int a, int b) {
  return (a+b)/2;
}
Run Code Online (Sandbox Code Playgroud)

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

并且在成功执行时,我看到的o/p是0而不是4,因此共享库中的mean的函数定义没有被执行,而主模块中的函数定义正在执行.

为什么会这样呢?

alk*_*alk 6

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

功能差异的原因是存在不同类型的符号.库函数是一个弱符号.仅在尚未定义时才包括它.nm是用于在对象或可执行文件中列出符号的工具.在它的联机帮助页中,您可以找到符号类型的列表.

还有一个关于弱符号的维基百科页面.