Makefile编译问题汇总

最近使用makefile编译遇到了些问题,反复地排查了4天多,才解决,要处理的问题很简单,就是把一堆.c文件编译打包成.so,然后再把.so和demo.o打包成可执行文件,遇到了下面 三个问题,总结一下:

(1)问题描述在这里http://bbs.csdn.net/topics/392070647

原因:在生成可执行文件的时候,加入了-shared参数,这时生成的并不是可执行文件,而是动态库,使用file命令查看即可看到文件的具体信息

解决方案:CFLAGS里去掉-shared参数,改为在要生成库的时候,手动添加-shared参数

(2)将之前的.so改为生成.a,然后打包生成可执行文件,生成失败,显示demo调用的库里定义的函数全部都找不到

原因:在链接的时候,编译器会按照从前往后的顺序寻找定义的函数、变量,先找到了一些调用,再在后面的.a中找函数的定义,因此这里打包的时候,.a和demo.o的顺序搞反了

解决方案:讲makefile里生成可执行文件时的依赖项的顺序调整一下,把库写在demo.o的后面,如下

pps_demo: $(DEMO_OBJ) lib_darknet.a
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
另外,同事建议,打包时的输入依赖项不要写成
$^
而是手动输入需要依赖哪些,这些会防止一些不必要的错误

(3)在生成库的时候,出现了如下错误

undefined reference to symbol 'pow@@GLIBC_2.2.5'
原因:不明确

解决方案:在LDFLAGS里添加-lm


P.S.

makefile里有时候定义的宏失效,这个也是跟编译参数的顺序有关的,宏定义在编译目标文件的时候要放在-c后边,参考这篇博客

http://blog.csdn.net/zww0815/article/details/51275274

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值