我有大约80个静态库。我想从那里创建一个静态库。
This answer对我不起作用,因为我收到以下错误:
libtool: unrecognized option `-static'
我也很困惑它需要做哪种模式。是“链接”还是“安装” 由于有20多个库,我还可以用“*”来指定所有的吗?
我没有在文件中找到任何信息this,这些信息并没有真正回答我的问题。
FYI ..这些是模式:
MODE must be one of the following:
clean remove files from the build directory
compile compile a source file into a libtool object
execute automatically set library path, then run a program
finish complete the installation of libtool libraries
install install libraries or executables
link create a library or an executable
uninstall remove libraries from an installed directory
答案 0 :(得分:4)
我可能会天真地忽略某些后果,但你不能直接将文件视为档案吗?
for i in *.a; ar x $i; done
ar r libfoo.a *.o
ranlib libfoo.a
当然,如果任何.o
文件相同,您将需要某种重命名方案。可能类似于libname_objectname.o
。
答案 1 :(得分:1)
第一个链接的答案是关于Mac OS libtool
,而不是GNU libtool。
如果您不介意编写安装挂钩,第二个链接实际上可能会起作用(此处显示为包含Makefile变量):
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ...
libtool“link”模式对于静态库来说似乎非常繁琐。我能够做到这一点,但它给了我警告 - 每个静态库一个,这对你来说是一个巨大的级联。
但在这种情况下绕过libtool
可能更容易。这适用于GNU ar:
lib_LIBRARIES=libsponge.a
libsponge.a : libfoo.a libbar.a ...
echo "CREATE $@" > libsponge-script
list='$^'; for p in $$list; do \
echo "ADDLIB $$p" >> libsponge-script; \
done
echo "SAVE" >> libsponge-script
$(AR) -M < libsponge-script
$(RANLIB) $@
如果这必须是便携式的,那么这样的事情就可以了:
lib_LIBRARIES=libsponge.a
libsponge.a : libfoo.a libbar.a ...
$(AR) cru $@
$(MKDIR_P) tmpar
list='$^'; for p in $$list; do \
(cd tmpar; $(AR) x "../$$p"; $(AR) q "../$@" *.o; rm *.o;) \
done
rm -rf tmpar
$(RANLIB) $@
答案 2 :(得分:0)
libtool查看gcc的参数,所以你应该有类似下面的内容
$ cat Makefile
all: libone libtwo
rm *.o
@libtool --mode=link gcc -all-static -o libcombo.a libone.a libtwo.a
libone: one.c
@libtool --mode=compile gcc -c one.c -o one.lo
@libtool --mode=link gcc -static -o libone.a one.lo
libtwo: two.c
@libtool --mode=compile gcc -c two.c -o two.lo
@libtool --mode=link gcc -static -o libtwo.a two.lo
clean:
rm -rf .libs *.lo *.o *.a