写Makefile踩过的坑

习惯了IDE的一键操作,突然写起Makefile文件,发现走了不少的弯路。

makefile中的指令必须是以tab键开头,如果是以空格开头,就可能会报missing seperators,多少个空格都不会等于tab键,这也是make本身设计的不合理的地方

-I 选项用于处理文件包含时的搜索路径,还以为只要把所有的路径用分号边接起来放在-I 后面就可以了,但是完全行不能,只能一个路径对应一个-I选项(中间不允许有空格)

-L选项用于处理库的搜索路径,经历了-I 选项的折磨,-L就没再犯类似的错了,不过链接库时 -l 选项却要注意库名是除了lib前缀和.a或.so后缀之后的名字,这就是说如果有个静态库全名叫libxxx.a,那么实际链接时,就只能是-lxxx

编译容易理解,但实际应用中,我犯了个错,把所有的源文件先编译成目标文件(*.o),然后再试图将这些.o文件链接成一个可执行文件,结果就出现了undefined reference to 'main',实际上main函数是有定义的,但是编译成目标文件之后,还是去除了符号的链接,此时的main函数早已被编译成了某个地址,于是链接时,就由于找不到main函数而出报错,后来的解决方法是把包含main函数的文件单独列出来编译并链接所需要的目标文件

链接,由于既有动态链接部分,又有静态链接部分,单是看gcc一大堆选项参数,尝试着用-static,-shared时,要么报某个静态库找不到,要么报某个动态库找不到,最后折腾了挺久才找到了解决方案,-Bstatic开始部分的库,被解释成静态链接,-Bdynamic开始部分被解释成动态链接,动态链接还需要在最后面加-Wl,--as-needed  

不大明白为什么要出一个-fPIC选项,这个选项的意思是编译位置无关的代码,我认为这个主要的应用场合就是动态链接库中的代码共享,如果代码段都不能共享,那似乎与静态库的功能比较相近(当然还是不一样的,比如最终生成的可执行文件的大小,易维护的程度不相同)。

编译、链接的选项实在不算少,有的还有部分是重复的,一堆的选项可以吓跑一部分刚接触的人,但其实掌握一些常用的应该就差不多了,特殊的情况等遇到时再处理吧。选项多的好处是可控制的部分多,更能为特殊应用场合定制最合适的方法,不好的地方就是不易完全掌握。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值