免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3558 | 回复: 7
打印 上一主题 下一主题

[C] 初学linux,编译的动静态库不正常,恳请高手指点,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-24 16:13 |只看该作者 |倒序浏览
我的makefile文件如下(照搬别人示例里的)

#CROSS_COMPILE =arm-linux-
LD  =$(CROSS_COMPILE)ld
CC  =$(CROSS_COMPILE)gcc
CPP  =$(CROSS_COMPILE)g++
AR  =$(CROSS_COMPILE)ar
STRIP =$(CROSS_COMPILE)strip
CFLAGS =-O2 -I .. -I libusb
#CFLAGS = -g -I ..
all:lib test.bin
lib:myapi.o myhid.o md5.o mydes.o myrsa.o
# cd libusb;make
$(AR)  -r mylib.a $^ ./libusb/*.o
$(LD) -fPIC -shared -o mylib.so.0.3 $^ ./libusb/*.o

test.bin:test.o mylib.a
$(CC) -o $@ $^
clean:
# cd libusb;make clean
rm -f *.o  mylib.a mylib.so* *.bin

在myapi.c中我已经
#include <time.h>
#include <openssl/rsa.h>
#include <openssl/des.h>

现象:
mylib.a和mylib.so.0.3都编译正常,已编译生成了这两个文件了,没有报错,但文件大小都只有60k左右,感觉不太对,太小了

但在链接test.bin时报了一大堆的错误,都是以下这些
undefined reference to 'GetTickCount'
undefined reference to 'RSA_new'
undefined reference to 'RSA_generate_key'
undefined reference to 'DES_ecb3_encrypt'

感觉错误原因是mylib.a中没有把time.h,openssl/rsa.h,openssl/des.h中的相关函数链接进来

但我对makefile不太熟悉,不知道怎么把这些需要的库文件链接进来,恳请高手指点该怎么来写这个makefile文件,谢谢了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2009-05-24 23:36 |只看该作者
>>test.bin:test.o mylib.a
把rsa还有其它的库添加到这个后面。

论坛徽章:
0
3 [报告]
发表于 2009-05-25 06:47 |只看该作者
谢谢lenovo版主的回复, 但项目要求是我的mylib.a中必须包含所有需要的库的代码, 客户程序test.c只需要链接我的mylib.a就行了,不需要另外再链接其他的库文件

但现在编译好的mylib.a才60k左右,明显并没有把所需的库代码静态包含进来,所以想知道该怎么弄,谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2009-05-25 12:28 |只看该作者
》》$(AR)  -r mylib.a $^ ./libusb/*.o
那就是在这一步时没有把rsa的库加进去。
你加上就好了。具体的参数什么的你查手册吧,我也不知道。
然后可以 用nm看静态库中的函数来确定有没有加入。

论坛徽章:
0
5 [报告]
发表于 2009-05-25 12:33 |只看该作者
把用到的库的.a,用ar解开,然后再用ar连到你自己的库中。

论坛徽章:
0
6 [报告]
发表于 2009-05-25 16:13 |只看该作者
原帖由 cwinex 于 2009-5-25 12:33 发表
把用到的库的.a,用ar解开,然后再用ar连到你自己的库中。

似乎只能这样, 不能.a不能直接包含.a文件. 即使包含了, 也不能达到包含.o文件的效果.

论坛徽章:
0
7 [报告]
发表于 2009-05-25 21:16 |只看该作者
谢谢大家热心回复,基本上明白了,思路是:
1.把/usr/lib/ssl.a解包,我想把它解到一个文件夹里,比如是ssl,放在.c程序所在的文件夹里
2.$(AR)  -r mylib.a $^ ./libusb/*.o这句改为
  $(AR)  -r mylib.a $^ ./libusb/*.o  ./ssl/*.o
这样估计就行了

现在的问题就是ar指令怎么用的问题了,查了下是用-x参数,明天上班了去实测一下,哪位大虾能指点一下最好了,省得再走冤枉路了

这样对吗:
ar -xo libssl.a /myssl/*.o

论坛徽章:
0
8 [报告]
发表于 2009-05-26 08:57 |只看该作者
早上来测试了,搞定了,谢谢大家

ar指令是这样的:
ax -xo /usr/lib/libssl.a
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP