首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用libtool从一堆静态库创建静态库

如何使用libtool从一堆静态库创建静态库
EN

Stack Overflow用户
提问于 2014-07-25 11:28:40
回答 3查看 9.1K关注 0票数 9

我有大约80个静态库。我想从中创建一个静态库。

这个答案没有为我工作,因为我得到了以下错误:

代码语言:javascript
运行
复制
libtool: unrecognized option `-static'

我也弄不清楚它需要在哪种模式下进行。它是“链接”还是“安装”,因为有20多个库,我是否也可以使用"*“来指定所有库?

我没有在文档中找到任何信息期望,这并没有真正回答我的问题。

FYI..These的模式如下:

代码语言:javascript
运行
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-01 21:50:14

我可能是天真地忽略了一些后果,但你就不能直接把这些文件当作档案处理吗?

代码语言:javascript
运行
复制
for i in *.a; ar x $i; done
ar r libfoo.a *.o
ranlib libfoo.a

当然,如果任何.o文件都是相同的,则需要某种重命名方案。可能有点像libname_objectname.o

票数 6
EN

Stack Overflow用户

发布于 2014-07-27 04:17:09

第一个链接的答案是关于Mac libtool,而不是GNU。

如果您不介意编写安装钩子,第二个链接实际上可能会工作(这里用Makefile变量包装):

代码语言:javascript
运行
复制
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(AR) cru "$(DESTDIR)$(libdir)/libsponge.a" libfoo.a libbar.a ...

与静态库相比,libtool的“链接”模式显得非常繁琐。我做到了,但它给了我警告--每个静态库一次,这对你来说是一个巨大的瀑布。

不过,在这种情况下,绕过libtool可能更容易一些。这将适用于GNU ar:

代码语言:javascript
运行
复制
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) $@

如果这个必须是可移植的,这样的东西就能工作:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-07-30 18:26:01

libtool查看gcc的参数,因此您应该有如下所示

代码语言:javascript
运行
复制
$ 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24954747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档