能否把一些静态库文件(.a)和.o文件一起打包成一个静态库文件?

kacy16 2010-03-02 08:00:30
各位高手,想请教各位一个问题:

我现在手头上有两个 libs1.a,libk1.a 这两个静态库文件,
然后我再写了一个 hh.cpp文件调用了这两个静态库的一些函数,
最后用
ar cr my.a libs1.a libk1.a hh.o 这个语句生成了my.a文件,
同时也用

g++ -fPic -shared -o my.so hh.o libs1.a libk1.a -pthread 生成了my.so文件.

可惜的是当我使用这个my.a 跟一个测试cpp连接时,编译时发现会出现以下的错误:
my.a: undefined reference to "Func1(int i)" 这样的错误,其中 Func1是libs1.a
所提供的函数.

但是我使用my.so跟测试cpp去进行编译,就没有报任何错误的.

想请教各位,怎么去用一些.a文件和.o文件去生成一个.a文件?怎么避免我所遇到的这个问题?




...全文
1139 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
knief不懂就问 2011-11-04
  • 打赏
  • 举报
回复
不错的方法啊
leemeng0x61 2010-03-04
  • 打赏
  • 举报
回复
3楼正解
字数不够
pengxn 2010-03-04
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
ar cr my.a libs1.a libk1.a  hh.o
========
这样有点问题吧,
建议先把libs1.a 和 libk1.a中的.o解出来,然后再加到my.a中

mkdir libs1 libk1
(cd libs1; ar x ../libs1.a)
(cd libk1; ar x ../libk1.a)
ar cr my.a libs1.a/*.o libk1/*.o hh.o


支持这样的做法
mymtom 2010-03-03
  • 打赏
  • 举报
回复
ar cr my.a libs1.a libk1.a hh.o
========
这样有点问题吧,
建议先把libs1.a 和 libk1.a中的.o解出来,然后再加到my.a中

mkdir libs1 libk1
(cd libs1; ar x ../libs1.a)
(cd libk1; ar x ../libk1.a)
ar cr my.a libs1.a/*.o libk1/*.o hh.o
kacy16 2010-03-03
  • 打赏
  • 举报
回复
谢谢老邓的方法,我先去试一试这个方法,谢谢!
mymtom 2010-03-03
  • 打赏
  • 举报
回复
.a文件就是文件包(archive), ar不检查文件类型的。
一般来说,.a里的文件都是合法的.o文件时,才可以作为库进行连接。
========
The ar utility can be used to create and maintain groups of files combined into an archive. Once an archive has been created, new files can be added, and existing files can be extracted, deleted or replaced. When an archive consists entirely of valid object files, the implementation will format the archive so that it is usable as a library for link editing (see c89, cc and fort77). When some of the archived files are not valid object files, the suitability of the archive for library use is undefined. If an archive file consists entirely of printable files, the entire archive file is printable.
========
http://www.opengroup.org/onlinepubs/7990989775/xcu/ar.html
kacy16 2010-03-03
  • 打赏
  • 举报
回复
引用 3 楼 mymtom 的回复:
ar cr my.a libs1.a libk1.a  hh.o
========
这样有点问题吧,
建议先把libs1.a 和 libk1.a中的.o解出来,然后再加到my.a中

mkdir libs1 libk1
(cd libs1; ar x ../libs1.a)
(cd libk1; ar x ../libk1.a)
ar cr my.a libs1.a/*.o libk1/*.o hh.o


谢谢mymtom的方法,我按照以上的做法,先把.a文件解成.o文件,然后再把这些.o文件打包成my.a文件后,
最后使用我的test.cpp去链接my.a,编译的时候发现不再报错了,问题解决了。
关于这个问题,对这方面有研究的兄弟能否解释一下这原因呢?
ar cr my.a libs1.a libk1.a hh.o 这个语句的问题在哪里呢?
kacy16 2010-03-03
  • 打赏
  • 举报
回复
谢谢老邓的一些建议,虽然我按照这些建议去试了,问题依旧存在.
老邓 2010-03-02
  • 打赏
  • 举报
回复
所我所知,ar就是干这个的。
先编译成o文件,再用ar添加到之前的.a文件中。

我感觉你的参数有问题,你尝试一下去掉c,看看警告。
或者将r换成q ?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧