gpt4 book ai didi

c - 多个符号定义和静态库

转载 作者:行者123 更新时间:2023-11-30 16:32:05 24 4
gpt4 key购买 nike

我在链接过程中遇到了稍微出乎意料的行为,我想请求澄清。

似乎链接目标文件和包含相同符号集的静态库并不等效。前者会导致多重定义错误,而后者似乎链接正确。

最小示例

文件a.cb.c相同:

void myfunc() {
}

文件 c.c 是“主要”:

void myfunc();

int main()
{
myfunc();
return -1;
}

编译链接工作流程如下:

$ gcc -c a.c b.c c.c
$ gcc c.o a.o b.o # Breaks!
a.o: In function `myfunc':
a.c:(.text+0x0): multiple definition of `myfunc'
b.o:b.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
$ ar rvs libb.a b.o
$ gcc c.o a.o -L./ -lb # Works fine?

我的问题是:如果对象和静态库中包含的符号相同,为什么允许第二个链接而第一个链接不允许?

此外,此行为是编译器特定的还是系统特定的?

扩展

这可能是一个单独的问题,但将其放在这里可能有用。如果在 b.c 文件中定义了附加函数,则静态库会再次出现多个引用的问题,例如对于 BC 包含

void myfunc() {
}
void anotherfunc() {
}

现在链接步骤中断,并出现与之前相同的错误:

gcc b.c 
gcc -L./ c.o -lb a.o
a.o: In function `myfunc':
a.c:(.text+0x0): multiple definition of `myfunc'
.//libb.a(b.o):b.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit stat

最佳答案

库只是目标文件的集合。不检查多个定义。

一个可执行文件只能有一个函数的定义。在链接过程中,链接器修复对象中函数的调用(地址)。如果它遇到同一函数(名称)的第二个定义,它不知道该使用哪一个。

请注意,静态库中具有多个定义通常也会导致链接器提示多个定义,因为它不知道要使用库的哪个对象。可以通过为链接器提供库的顺序来解决多个库中的多个定义:它将使用遇到的第一个符号。

关于c - 多个符号定义和静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50292838/

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