源码
----------
main.c
----------
extern void two();
int main()
{
two();
}
----------
one.c
----------
void one(){};
----------
two.c
----------
extern void one();
void two()
{
one();
}
链接
$ ar -clq libone.a one.o
$ ar -clq libtwo.a two.o
$ gcc -o main main.c -L. -lone -ltwo
(此处报错)
链接器从main()中调用two(),因为还没引用one(),所以连接器认为可以安全地删除包含one()的模块。
链接器接下来处理libtwo.a,并且从main()中调用two()。但现在却无法调用one(),因为链接器在之前已经删除了one()模块,所以它由于无法调用one()而无法运行,上文gcc命令会报错
解决方案很简单,只要改变库在命令行中的位置就行了
$ gcc -o main() main.c -L. -ltwo -lone
现在运行gcc才不会报错