【问题标题】:How can I know what libs are being linked dynamically into a static lib?我如何知道哪些库被动态链接到静态库中?
【发布时间】:2011-05-27 06:31:32
【问题描述】:

假设我有一个 libmy.a 静态库,我想知道它动态链接了哪些库。实际上我需要以下内容:我将创建一个新的动态库,比如 libmy2.so,它将链接一个 .o 文件(目标文件)和 libmy.a。所以我想知道什么库最终会加载 libmy2.so。

【问题讨论】:

    标签: c++ linker libraries loader


    【解决方案1】:

    静态库不链接其他库,无论是静态的还是动态的。

    好的,假设有两个 C++ 文件,a.cp​​p 和 b.cpp。

    g++ -c a.cpp -o a.o         // compile a.cpp to a.o
    rm -f lib1.a                // no existing lib1.a (this is not essential)
    ar rvs lib1.a a.o           // create library lib1.a and add a.o to it
    g++ -c b.cpp -o b.o         // compile b.cpp to b.o
    ar rvs lib1.a b.o           // ad b.o to existing lib1.a
    

    显然,您可以在各个阶段之间进行任意数量的复制,以生成具有您想要的名称的库。你也可以这样做

    ar --help
    

    获取 ar 选项,这可能会稍微简化流程。坦率地说,这是我几乎从不使用的命令,除了从对象列表构建静态库。

    【讨论】:

    • 特别是,你的意思是我不能建立一个静态库,它静态链接其他库吗?
    • @Narek 是的 - 应用程序或共享库可以与其他静态或共享库链接,但静态库不能,因为它们只是目标文件的存档。
    • 链接到一个目标文件一堆目标文件有什么问题,即。 e.一个静态库,并获得大量目标文件 + 1 个静态库?
    • @Narek 您可以归档(而不是链接)一堆目标文件以生成静态库。
    • 请编写从 liba1.a 生成 libb1.a 的命令,将 myObject.o 文件添加到其中。
    【解决方案2】:

    在 Mac 上,它会是 nm -m C libname.a

    【讨论】:

      【解决方案3】:

      您可以使用以下命令检查静态库的内容:

      nm -C libname.a | less  
      

      $ar -vt libname.a 
      

      【讨论】:

        【解决方案4】:

        动态库将仅动态链接到您在构建时使用-l 指定的那些动态库。静态库主要是链接代表一组 *.o 文件的时间实体,它们必须由链接器处理以生成可执行代码,因此在构建静态库时不需要提供所有实现。一切都是在目标可执行文件的最终链接期间设置的。

        【讨论】:

          猜你喜欢
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          相关资源
          最近更新 更多