Chinaunix

标题: 可以把多个.a文件打包进一个.a文件中吗? [打印本页]

作者: wooin    时间: 2009-12-21 19:22
标题: 可以把多个.a文件打包进一个.a文件中吗?
我有多个.a文件:liba.a libb.a libc.a
然后将它们用下面的目录打包在一个.a文件中:
$ ar -rcs libobj.a libaa.a libab.a libac.a

没有报任何错误,成功生成了libobj.a文件,但是我在用libobj.a文件生成应用程序时出错了:
$ g++ -o hello hello.cpp libobj.a

出错了:
libobj.a: could not read symbols: 归档没有索引;运行 ranlib 以添加一个

我执行了:
$ ranlib libobj.a

成功执行,但是编译的时候还是报一样的错。
为什么?可以把多个.a文件打包进一个.a文件中吗?
作者: pagx    时间: 2009-12-21 20:02
ar 只是一个打包器(跟tar功能相同), 又不是编译器,怎么会报错呢,最多就是来一个找不到文件而已。
你需要做的是把 .a 里面的文件给拆出来,然后再ar。
作者: wooin    时间: 2009-12-21 22:03
原帖由 pagx 于 2009-12-21 20:02 发表
ar 只是一个打包器(跟tar功能相同), 又不是编译器,怎么会报错呢,最多就是来一个找不到文件而已。
你需要做的是把 .a 里面的文件给拆出来,然后再ar。


就是.o文件太多了,所以才想分成几个.a文件。
多个.a文件不能再打包成.a文件吗?
作者: wxfjx    时间: 2009-12-21 22:36
应该是不行的,我曾经做过实验,将静态库文件和.o文件一起打包成一个静态库文件,结果是:所有的函数都是不能调用的
作者: wooin    时间: 2009-12-22 09:49
原帖由 wxfjx 于 2009-12-21 22:36 发表
应该是不行的,我曾经做过实验,将静态库文件和.o文件一起打包成一个静态库文件,结果是:所有的函数都是不能调用的


对,我也做了这个实验,确实不行。
是参数没有设置对呢?还是根本就不行?。。。
作者: pagx    时间: 2009-12-22 09:53
最多也是机器帮你处理,少操那份心。
作者: wxfjx    时间: 2009-12-22 10:49
原帖由 pagx 于 2009-12-22 09:53 发表
最多也是机器帮你处理,少操那份心。

也不是少操那份心,

公司在现有的一个静态库上搞开发,想在静态库上加个壳,添加一些API,也做成一个静态库,那怎么办?这个问题一直没有解决,暂时搁浅……
作者: pagx    时间: 2009-12-22 11:38
ar a libxxx.a killboss.o
randlib libxxx.a

这样可以不?
作者: langue    时间: 2009-12-22 12:00
.a 只是 Unix archive,可以存储任何文件,你用 ar 打包进去的不是 .o,而是 .a。
正确的做法是先解包,再重新打包成单一的 archive。
作者: wxfjx    时间: 2009-12-22 12:06
楼上版主大哥,具体怎么样解包啊?谢谢
作者: langue    时间: 2009-12-22 12:11
标题: 回复 #10 wxfjx 的帖子
Usage: /usr/libexec/elf/ar [-X32_64] [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file file...
       /usr/libexec/elf/ar -M [<mri-script]
commands:
  d            - delete file(s) from the archive
  m[ab]        - move file(s) in the archive
  p            - print file(s) found in the archive
  q[f]         - quick append file(s) to the archive
  r[ab][f][u]  - replace existing or insert new file(s) into the archive
  t            - display contents of archive
  x[o]         - extract file(s) from the archive
command specific modifiers:
  [a]          - put file(s) after [member-name]
  [b]          - put file(s) before [member-name] (same as [i])
  [N]          - use instance [count] of name
  [f]          - truncate inserted file names
  [P]          - use full path names when matching
  [o]          - preserve original dates
  [u]          - only replace files that are newer than current archive contents
generic modifiers:
  [c]          - do not warn if the library had to be created
  [s]          - create an archive index (cf. ranlib)
  [S]          - do not build a symbol table
  [v]          - be verbose
  [V]          - display the version number
  [-X32_64]    - (ignored)
/usr/libexec/elf/ar: supported targets: elf32-i386 srec symbolsrec tekhex binary ihex

很明显,x 命令是用来解包的,这和 tar 一样。tar 只不过是 tape archive 的意思而已嘛 :wink:

$ ar x archive.a
作者: ubuntuer    时间: 2009-12-22 12:34
  遇问题先man 有加就有解
作者: wxfjx    时间: 2009-12-22 13:45
谢谢斑竹,
马上就试试看,应该能成功了:wink:
作者: wooin    时间: 2009-12-22 13:47
原帖由 pagx 于 2009-12-22 11:38 发表
ar a libxxx.a killboss.o
randlib libxxx.a

这样可以不?

顶楼已经说得很清楚了呀。
作者: wooin    时间: 2009-12-22 13:50
原帖由 langue 于 2009-12-22 12:00 发表
.a 只是 Unix archive,可以存储任何文件,你用 ar 打包进去的不是 .o,而是 .a。
正确的做法是先解包,再重新打包成单一的 archive。


版主的意思是不是说多个.a文件打包成的.a文件不能当成正常的.a文件使用,

而是要将多个.a文件分别解包成更多个.o文件,再将这些.o文件打包成一个.a文件?
作者: wxfjx    时间: 2009-12-22 14:07
楼上正解,刚试了下,就是这样的,呵呵,谢谢斑竹
作者: 20065562    时间: 2010-03-02 14:20
可以的。直接将.a文件打包成.a件是不可以的。即使生成了.a文件也是不正确的。请参考本人写的一篇文章,正是将多个.a(一般是子目录库文件)打包成一个大的.a文件。

linux ar 打包库到另一个库中
http://hi.baidu.com/20065562/blo ... bf73084c088db7.html

答案来自:『20065562's Blog』 有水的地方就有余
作者: yulihua49    时间: 2010-03-02 15:25
我有多个.a文件:liba.a libb.a libc.a
然后将它们用下面的目录打包在一个.a文件中:
$ ar -rcs libobj.a ...
wooin 发表于 2009-12-21 19:22



    键一个目录,把n多.a拆到这个目录,然后打包成一个.a。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2