【问题标题】:What do link flags mean for static library?链接标志对静态库意味着什么?
【发布时间】:2019-05-07 09:41:58
【问题描述】:

"ar" -- 只是创建档案的工具。

所有“lib*.a”形式的静态库实际上只是归档的编译对象+带有符号表的附加文件,由“ranlib”添加。 在创建此类库期间未执行任何链接。

那么为什么大多数项目在创建此类(“lib*.a”静态库)档案时在其Makefile.am 中使用***_LDFLAGS***_LIBADD

automake 是否忽略这些标志(以防它们与任何“lib*.a”静态库相关),或者它实际上是否链接了那里的东西?

【问题讨论】:

    标签: c++ c linker static-libraries automake


    【解决方案1】:

    那么为什么大多数项目在创建此类(“lib*.a”静态库)档案时在其 Makefile.am 中使用 ***_LDFLAGS***_LIBADD

    GNU 构建系统能够使用--enable-shared--enable-static 标志创建在configure 时间确定的动态和静态库(或两者)。如您所料,_LDFLAGS_LIBADD 更面向动态共享对象或程序链接,而不是静态链接器。 libtool 的静态链接器本质上是另一个链接传递,它调用 ar 来创建存档(省略所有标志)。例如:

    lib_LTLIBRARIES=libfoo.la
    libfoo_la_SOURCES=$(SRCS)
    libfoo_la_LDFLAGS=-Wl,-t
    

    当生成共享库和静态库时,输出如下:

    libtool: link: gcc -shared  -fPIC -DPIC  .libs/foo.o    -g -O2 -Wl,-t   -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
    ...
    libtool: link: (cd ".libs" && rm -f "libfoo.so.0" && ln -s "libfoo.so.0.0.0" "libfoo.so.0")
    libtool: link: (cd ".libs" && rm -f "libfoo.so" && ln -s "libfoo.so.0.0.0" "libfoo.so")
    libtool: link: ar cru .libs/libfoo.a  foo.o
    libtool: link: ranlib .libs/libfoo.a
    libtool: link: ( cd ".libs" && rm -f "libfoo.la" && ln -s "../libfoo.la" "libfoo.la" )
    

    automake 确实忽略了_LDFLAGS;但是执行链接的脚本 (libtool) 没有。它还会查找影响链接的标志。例如:

    lib_LTLIBRARIES=libfoo.la
    libfoo_la_SOURCES=$(SRCS)
    libfoo_la_LDFLAGS=-Wl,-t -static
    

    生成静态库,即使运行 configure --disable-static 来生成 Makefile。

    libtool 只是本机编译器/链接器工具的包装脚本,以实现可移植性。

    【讨论】:

      【解决方案2】:

      您的问题Does automake ignore them 的答案是:

      完全正确:“"ar" -- 只是创建档案的工具。”
      但是,Automake 根本不会在他们的 Makefile.am 中忽略 ***_LDFLAGS ***_LIBADD,否则如果它们对构建系统没有任何意义,那么拥有这样的标志有什么意义!

      来自文档(链接如下):

      • library_LIBADD”变量应该用于列出额外的 libtool 对象(.lo 文件)或 libtool 库(.la) 添加到库中。
      • library_LDFLAGS”变量用于列出其他 libtool 链接标志,例如 -version-info-static 等等。

      有关更多详细信息,您应该阅读此 Libtool 文档以更清楚地了解这些标志。



      编辑: 由于您的问题仍然很笼统,让我把它放在两个不同的场景中......

      1. 静态库是独立的

        • 在这种情况下,***_LIBADD 可能没有多大用处,如文档中所述:“library_LIBADD 变量应该用于列出额外的 libtool 对象(.lo 文件)或 libtool 库(.la ) 添加到 "
        • 这意味着,如果您的静态库没有依赖项,那么这个标志在它的 Makefile.am 中是没有用的。
      2. 静态库是依赖的(不是独立的)

        • 从上面引用的文档中可以看出,***_LIBADD 标志用于提及构建当前所需的库名称。
        • 所以这个标志在这样的要求中是必要的。

      关于***_LDFLAGS,如文档中所述,library_LDFLAGS 变量是列出该库的其他 libtool 链接标志的位置

      • 如果您的库不需要此类标志,则也可以忽略它。这完全取决于您想要的最终结果。

      其他几个链接供您参考:

      我希望这个 EDIT 满足您的需求。

      PS:如果您仔细阅读我的回答并阅读文档,您可以获得相同的数据。恩乔伊。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2016-12-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2017-03-09
        • 1970-01-01
        • 2015-10-02
        相关资源
        最近更新 更多