为什么缺少共享的图书馆会致命?

时间:2011-07-04 03:41:22

标签: gcc compiler-construction linker dynamic-linking

g++ -o Test Test.cpp -lTest
/usr/bin/ld: cannot find -lTest
collect2: ld returned 1 exit status

如果在运行时按需加载来自共享/动态库的符号,为什么在编译时缺少库会导致致命错误?

1 个答案:

答案 0 :(得分:5)

  1. 在运行时可能难以处理库间依赖关系;编译时检查允许链接器检测并有时解析依赖循环,并将任何其他库依赖项添加到运行时链接列表中。
  2. 您是否希望在编译/链接时或运行时发现拼写错误的符号名称?大多数人更喜欢前者,因此链接器检查所有符号是否已解析,而不是将其推迟到运行时加载器;这当然要求所有的图书馆都存在。
  3. 假设动态库需要存在一个静态库,否则将无法链接。在大多数平台上,您不能(或不能理智或安全地)在运行时加载静态库,因此链接器需要在链接时处理这些问题。 (这实际上是#1的子案例。)