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

时间:2019-05-07 09:41:58

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

“ ar”-只是用于创建存档的工具。

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

那么为什么大多数项目在创建这样的(“ lib * .a”静态库)归档文件时在其***_LDFLAGS中使用***_LIBADD Makefile.am

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

2 个答案:

答案 0 :(得分:3)

  

那么为什么大多数项目在创建这样的(“ lib * .a”静态库)归档文件时在其Makefile.am中使用***_LDFLAGS ***_LIBADD

GNU Build System能够使用configure--enable-shared标志创建在--enable-static时确定的动态和静态库(或两者)。如您所料,_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只是本机编译器/链接器工具上的包装器脚本,以实现可移植性。

答案 1 :(得分:1)

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

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

摘自文档(链接如下):

  • 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链接标志的地方

  • 如果您的lib不需要这样的标志,则也可以将其忽略。一切都取决于您希望如何获得最终结果。

更多其他链接供您参考:

我希望此EDIT足以满足您的需求。

PS:如果您仔细阅读我的回答并仔细阅读文档,则可能获得相同的数据。 Njoy。 :)