2011-07-04 197 views
2
g++ -o Test Test.cpp -lTest 
/usr/bin/ld: cannot find -lTest 
collect2: ld returned 1 exit status 

如果共享/动态库中的符号在运行时按需加载,那么为什么在编译时库会丢失一个致命错误?为什么缺少共享库致命?

回答

5
  1. 在运行时很难处理库间依赖关系;编译时检查允许链接程序检测并有时解析依赖关系循环,并将任何附加库依赖关系添加到运行时链接列表中。
  2. 你想知道在编译/链接时或者运行时拼错了一个符号名吗?大多数人更喜欢前者,因此链接器会检查所有符号是否已解析,而不是将其推迟到运行时加载器;这当然需要所有的库存在。
  3. 假设一个动态库需要存在一个静态库,否则这个静态库不会被链接。在大多数平台上,你不能(或者不能明智或安全地)在运行时加载静态库,所以链接器需要在链接时处理这些问题。 (这实际上是#1的子情况。)
+0

是否至少有一种方法可以禁用它?并不是说我有一个很好的理由,但是你会认为他们会让它成为可选的。 – Maxpm

+0

我其实不会这么想。如果你不想编译/链接时间库链接/加载,那么在编译时不要链接它;在运行时在程序中使用'dlopen()'。在编译时进行链接是特别说你想编译时检查。 – geekosaur