link 标志对静态库意味着什么?

What do link flags mean for static library?

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

所有 "lib*.a" 形式的静态库实际上只是归档编译对象 + 带有符号 table 的附加文件,由 "ranlib" 添加。 在创建此类库期间没有 linking 正在执行。

那么,为什么大多数项目在创建此类("lib*.a" 静态库)存档期间在其 Makefile.am 中使用 ***_LDFLAGS ***_LIBADD

automake 会忽略这些标志(以防它们与任何 "lib*.a" 静态库相关),还是实际上 link 那里有什么东西?

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

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

来自文档(link 下面给出):

  • library_LIBADD”变量应该用于列出额外的 libtool 对象(.lo 文件)或 libtool 库 (.la) 添加到库中。
  • library_LDFLAGS”变量是列出其他 libtool linking 标志的地方,例如 -version-info-static,还有更多。

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



编辑: 由于您的问题仍然很笼统,让我将其分为两种不同的情况...

  1. 静态库是stand-alone:

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

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

关于 ***_LDFLAGS,如文档中所述,library_LDFLAGS 变量是列出其他 libtool linking 标志 的地方那个图书馆。

  • 如果你的库不需要这样的标志,那么这个也可以忽略。这完全取决于您想要的最终结果。

另外 link 供您参考:

  • LDFLAGS usage in autotools with libtool
  • What is the difference between LDADD and LIBADD?

我希望这个编辑能满足您的需求。

PS:如果您仔细阅读我的回答并阅读文档,您可能会得到相同的数据。喜欢。 :)

So why do most of projects use ***_LDFLAGS ***_LIBADD in their Makefile.am during creation of such ("lib*.a" static library) archives?

GNU 构建系统能够使用 --enable-shared--enable-static 标志创建在 configure 时间确定的动态和静态库(或两者)。正如您所猜测的那样,_LDFLAGS_LIBADD 更倾向于动态共享对象或程序 linkage 而不是静态 linker。 libtool 的静态 linker 本质上是另一个 link 调用 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;但是执行 linking (libtool) 的脚本不会。它还会查找影响 linking 的标志。例如:

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

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

libtool 只是本机 compiler/linker 工具的包装脚本以实现可移植性。