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

你可能感兴趣的:(Linux)