程序在编译过程中,有时候会碰到符号冲突无法编译通过的问题,有时候会碰到符号冲突最终只选择了一个的问题,因此本文从链接的角度讨论一下这两个现象的背后原因。
add.c
int add(int a, int b)
{
return a+b;
}
add2.c
int add(int a, int b)
{
return a*b;
}
main.c
#include <stdio.h>
int add(int,int);
int main()
{
int a = add (3,4);
printf ("3+4=%d\n", a);
return 0;
}
> gcc -c main.c add.c add2.c
> gcc main.o add.o add2.o
/usr/bin/ld: add2.o: in function `add‘:
add2.c:(.text+0x0): multiple definition of `add‘; add.o:add.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
同样使用上述三个源文件。
> gcc -c main.c add.c add2.c
> ar -rcs libadd.a add.o
> ar -rcs libadd2.a add2.o
> gcc main.o -L. -ladd -ladd2
> ./a.out
3+4=7
> gcc main.o -L. -ladd2 -ladd
> ./a.out
3+4=12
原文:https://www.cnblogs.com/amazzzzzing/p/14820462.html