若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136139652
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)
Qt开发专栏:各种问题解决(点击传送门)
问题
老项目A工程,新项目B工程,实际环境是依赖A,所以复制了A改名为B,A的ffmpeg可以编译依赖过去,B的ffmpeg出现“mingw32-make[2]: *** No rule to make target ‘…/…/view360NoBodyRemoteCarDemo/modules/ffmpegPlayerManager/ffmpeg-3.4.2-win32-dev/include/libavcodec/avcodec.h’, needed by ‘release/main.o’. Stop.”的原因定位。
编译错误,如下图:
排除了环境因素、依赖头文件路径等常规(模块化相对部署,不会出现这些问题),下面给出定位过程,以供大家学习,遇到问题不要慌,一步一步拆解论证即可。
解决过程
检查是否包含:
确认包含了:
其实这是从A到B项目,A可以使用,B编译就缺少头文件,路径和编译环境检查都没有问题。
新建了一个子工程playerDemo,模块ffmpegPlayManager.pri是一样的,然后子工程也是一样的,老项目A编译没问题(缓存都删了):
新项目B的playerDemo子工程编译不行:
删掉A项目的.pro.user文件和shadow,重新配置mingw32为环境,新的可以直接通过:
删掉B项目的.pro.user文件和shadow,重新配置mingw32为环境,新的编译还是出错:
综合以上,真的是个目前能检查做的基本做了,未发现原因。
对比了makefile,大小不一样:
深度比较下:
目前,得出结论,两边除了大工程的名字不一样,其他一摸一样,一个行一个不行。
是不是工程名noBody踩中了关键字,复制下,修改项目B名字为view361RemoteCarDemo(注意里面的.pro也要改,删掉环境.user):
继续打开功程B”,看看,确实可以:
然后再改回来看看,(模块都是相对路径,直接移动到最外面,B‘'改名称为A’‘):
打开工程:
分别编译测试,结果又是都没有问题(结论:排除了名称踩关键字的原因,理论上也不会,但是我们需要论证):
在用这个改回来名字的去替换,最原始的出问题的项目B,编译还是有问题
不得不怀疑是否是文件路径太长了超过256个字符导致的?发现并不长:(这是关键因素的开始)
是否是shadow之后长了?这个论证很简单,直接改为去掉shadow编译:
基本得出结论了,确实就是shadow编译加起来整个路径太长了导致的,检查也不是很长,为了进一步确认,我们直接改下shadow的文件夹,改短点:
改短后,编译通过:
按照原理来说,windows不超过256字节就可以了,应该是shadow的全路径+ffmpge的include的相对路径超过了256字节,所以编译时候的环境就定位不到这个,单独的路径又能定位到(正好ffmpge模块的名称有点长)。
结论
windows不超过256字节就可以了,应该是shadow的全路径+ffmpge的include的相对路径超过了256字节,所以编译时候的环境就定位不到这个,单独的路径又能定位到(正好ffmpge模块的名称有点长)。
解决方法
下次注意,本次不使用shadow编译,项目B暂不改名称,不影响其他人开发。
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136139652