注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[C/C++笔记]动态库和静态库的链接问题  

2013-01-10 23:22:48|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
       将一个最小的alsa放音程序作为一个文件叫audio_adapter.c,里面有一个函数play_audio;另有一个文件alsa_test.c,里面的main函数调用play_audio。编译时,直接将audio_adapter.o和alsa_test.o进行链接,且链接的过程中使用alsa-lib库“-lasound”,放音正常。

一、编译成静态库,使用命令:
//将audio_adapter.c编译成静态库
# arm-none-linux-gnueabi-gcc -c audio_adapter.c -I../../include
# arm-none-linux-gnueabi-ar rs libaudio_adapter.a audio_adapter.o
//生成可执行文件
# arm-none-linux-gnueabi-gcc -c alsa_test.c -I../../include
# arm-none-linux-gnueabi-gcc -L. -laudio_adapter -lasound alsa_test.o -o alsa_test
       链接时出现如下错误:
alsa_test.c: In function `main':
alsa_test.c: (.text+0x7): undefined reference to `play_audio'
collect2: ld returned 1 exit status
       解决办法:将命令中的语句位置进行调整,如下所示:
# arm-none-linux-gnueabi-gcc -L. alsa_test.o -laudio_adapter -lasound -o alsa_test
       原因:使用静态库时有一个好处,链接器从静态库中只取出需要的部分来链接。所以链接时命令的顺序是越底层的越靠后,在这里就是链接器先在alsa_test.o中找到未定义的函数play_audio,然后再去libaudio_adapter中找;如果是libaudio_adapter.a在前,则链接器不知道要查找那条语句,在链接alsa_test时就会找不到play_audio,从而出错。

二、编译成动态库,使用命令:
//将audio_adapter.c编译成动态库
# arm-none-linux-gnueabi-gcc -c audio_adapter.c -I../../include
# arm-none-linux-gnueabi-gcc -shared -o libaudio_adapter.so audio_adapter.o
//生成可执行文件
# arm-none-linux-gnueabi-gcc -c alsa_test.c -I../../include
# arm-none-linux-gnueabi-gcc -L. alsa_test.o -o alsa_test -laudio_adapter -lasound
       运行时,会在play_audio中的某个调用alsa-lib的库函数的地方出错。
       解决办法:在编译成功libaudio_adapter.so时,添加alsa-lib的库-lasound。即使用语句:
# arm-none-linux-gnueabi-gcc -shared -o libaudio_adapter.so audio_adapter.o -lasound
       原因:在链接共享库时,只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,play_audio调用alsa-lib的库函数仍只是未定义的符号,要在运行时做动态链接。所以要在生成libaudio_adapter.so时指定-lasound,这样程序在运行到play_audio时才会去动态链接alsa-lib的库函数。
  评论这张
 
阅读(1447)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017