为什么有时需要为 C link 列出两次库,这是可以避免的吗?

Why do you need to sometimes list a library twice for C link and is it avoidable?

我正在编译一个程序,并得到一个 "undefined reference" 到一个在 lib1 的 C 文件中定义的常量变量,它在 lib2 中使用。如果我编译为:

,我会得到错误
clang myfile.c -L. -L../lib2dir -llib1 -llib2 

我记得在 Unix 时代,有时您必须再次添加一个库。所以我做了:

clang myfile.c -L. -L../lib2dir -llib1 -llib2 -llib1

它链接了。为什么这仍然是必要的,或者我做错了什么而不应该是必要的?

这些库按照它们在命令行中的放置顺序进行链接。链接库时,只会从中解析缺少的符号。由于您提到的符号在 lib2 中,因此不会从 lib1 中解析它,因为链接器尚不知道稍后需要它。所以,把 -llib2 放在 -llib1 前面。