【发布时间】:2018-05-11 12:54:52
【问题描述】:
我在链接过程中遇到了一个有点意外的行为,我想要求澄清一下。
似乎链接到一个目标文件和一个包含相同符号集的静态库是不等价的。前者导致multiple definition 错误,而后者似乎链接正确。
小例子
文件a.c和b.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 文件(例如对于 b.c 包含
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 compilation linker linker-errors