[2019-02-25]在linux下链接静态库动态库的方法和区别

1. 创建ubinode_demo工程目录,在该目录下创建include、src、lib、dynamiclib、output、obj子目录,将xmlrpc头文件、静态库和动态库分别拷贝到include、lib、dynamiclib目录下。

2. 编写Makefile文件

3. 在src目录下创建并编辑源代码,并在include目录下编写相应头文件。

4. 执行make

(1)采用静态库编译

出现如下错误:

原因如下:

Makefile在写明其链接的静态库时,要严格按照其依赖关系,越是底层的库,越往后面写。在链接静态库库时,libxmlrpc_client.a依赖其他的库。

解决方法:

链接xmlrpc静态库时将 -lxmlrpc_client \移到最前面的位置。

(2)采用动态库编译

修改makefile文件中如下命令:

XMLRPCLIBS = -L$(DYNAMICLIBDIR) \

出现如下错误:

解决方法:删除makefile中此库的链接。

(3)查看由动态库生成的可执行文件的大小时,发现和静态库生成的可执行程序大小一样。

原因如下:

$(DEMOBIN):

$(CC) -o $(DEMOBIN) $(C_FILES) $(INCLUDES) $(CURLLIBS) $(CJSONLIBS) $(XMLRPCLIBS) -lm -lrt -lpthread -ldl

不同目录下同名的库,只取第一个,后面的同名库被忽略。即在编译链接时使用了CURLLIBS目录下的xmlrpc静态库。

解决方法:

$(DEMOBIN):

$(CC) -o $(DEMOBIN) $(C_FILES) $(INCLUDES) $(XMLRPCLIBS $(CURLLIBS) $(CJSONLIBS) -ldl -lm -lrt -lpthread

 

5 . 下载到设备运行程序

(1)静态库

将生成的可执行文件下载到设备,赋予执行权限运行程序。

(2)动态库

方法1:将动态库下载到设备的/usr/lib目录,将可执行文件下载到设备,赋予执行权限运行程序。

方法2:将动态库和可执行文件打包下载到设备,解压后进入目录,赋予执行权限运行程序。

 

6、动态库(.so)和静态库(.a)的区别:

1、Makefile在写明其链接的库时,静态库要严格按照其依赖关系,动态库则不用。

2、静态库被添加为程序的一部分使用,生成的可执行文件大。动态库只是说明要用到这个库,并没有包含库的内容,生成的可执行文件较静态库小,但运行时需要将所有的动态库下载到设备。

3、如果静态库重新编译,应用程序也要重新编译,不利于维护与更新;动态库是程序运行时加载的,所以只需更新动态库即可。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值