“ ar”-只是用于创建存档的工具。
所有形式为“ lib * .a”的静态库实际上只是归档的编译对象+带有符号表的附加文件,并由“ ranlib”添加。 创建此类库期间没有链接。
那么为什么大多数项目在创建这样的(“ lib * .a”静态库)归档文件时在其***_LDFLAGS
中使用***_LIBADD
Makefile.am
?
automake是否会忽略这些标志(以防它们与任何“ lib * .a”静态库相关联),或者实际上是否在那里链接了某些东西?
答案 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文档,以使这些标志更加清晰。
编辑:
由于您的问题仍然很普遍,让我将其放在两种不同的情况下...
静态库是独立的:
***_LIBADD
可能没有太大用处,如文档中所述:“ library_LIBADD
变量应用于列出额外的libtool对象(.lo
文件)或libtool库(.la
)添加到 库” Makefile.am
中将不再使用。静态库是依赖的(不是独立的)
***_LIBADD
标志用于提及构建当前库所需的库名称。关于文档中提到的***_LDFLAGS
, library_LDFLAGS
变量是列出该库的其他libtool链接标志的地方。
更多其他链接供您参考:
我希望此EDIT足以满足您的需求。
PS:如果您仔细阅读我的回答并仔细阅读文档,则可能获得相同的数据。 Njoy。 :)