我有大约80个静态库。我想从中创建一个静态库。
这个答案没有为我工作,因为我得到了以下错误:
libtool: unrecognized option `-static'
我也弄不清楚它需要在哪种模式下进行。它是“链接”还是“安装”,因为有20多个库,我是否也可以使用"*“来指定所有库?
我没有在文档中找到任何信息期望这,这并没有真正回答我的问题。
FYI..These的模式如下:
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
发布于 2014-08-01 21:50:14
我可能是天真地忽略了一些后果,但你就不能直接把这些文件当作档案处理吗?
for i in *.a; ar x $i; done
ar r libfoo.a *.o
ranlib libfoo.a
当然,如果任何.o
文件都是相同的,则需要某种重命名方案。可能有点像libname_objectname.o
。
发布于 2014-07-27 04:17:09
第一个链接的答案是关于Mac libtool
,而不是GNU。
如果您不介意编写安装钩子,第二个链接实际上可能会工作(这里用Makefile变量包装):
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ...
与静态库相比,libtool的“链接”模式显得非常繁琐。我做到了,但它给了我警告--每个静态库一次,这对你来说是一个巨大的瀑布。
不过,在这种情况下,绕过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) $@
发布于 2014-07-30 18:26:01
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
https://stackoverflow.com/questions/24954747
复制相似问题