那么为什么大多数项目在创建此类(“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 只是本机编译器/链接器工具的包装脚本,以实现可移植性。