Gcc 为什么丢失的共享库是致命的?

Gcc 为什么丢失的共享库是致命的?,gcc,compiler-construction,linker,dynamic-linking,Gcc,Compiler Construction,Linker,Dynamic Linking,如果共享/动态库中的符号在运行时按需加载,为什么库在编译时丢失是一个致命错误 在运行时很难处理库间依赖关系;编译时检查允许链接器检测并有时解析依赖项循环,并将任何其他库依赖项添加到运行时链接列表中 您是希望在编译/链接时还是在运行时发现符号名称拼写错误?大多数人喜欢前者,因此链接器检查所有符号是否已解析,而不是将其延迟到运行时加载程序;这当然需要所有的图书馆都在场 假设一个动态库需要一个静态库,否则它就不会被链接到其中。在大多数平台上,您无法(或无法正常或安全地)在运行时加载静态库,因此链接器需

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

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

  • 至少有办法禁用它吗?并不是说我有充分的理由这么做,但你会认为他们会让它成为可选的。事实上,我不会这么认为。如果您不希望编译/链接时库链接/加载,那么不要在编译时链接它
    dlopen()
    在运行时将其保存在程序中。编译时链接是指需要编译时检查。
    g++ -o Test Test.cpp -lTest
    /usr/bin/ld: cannot find -lTest
    collect2: ld returned 1 exit status