【问题标题】:Why is a Missing Shared Library Fatal?为什么缺少共享库是致命的?
【发布时间】:2011-07-04 03:41:22
【问题描述】:
g++ -o Test Test.cpp -lTest
/usr/bin/ld: cannot find -lTest
collect2: ld returned 1 exit status

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

【问题讨论】:

    标签: gcc compiler-construction linker dynamic-linking


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

    【讨论】:

    • 至少有办法禁用它吗?并不是说我有充分的理由这样做,但您会认为他们会将其设为可选。
    • 其实我不会这么想。如果您不想编译/链接时库链接/加载,那么不要在编译时链接它; dlopen() 运行时在你的程序中。在编译时链接是专门说你想要编译时检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2016-10-04
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多