qmake生成的Makefile在make install时遇到的一次错误
遇到问题
使用qmake管理的一个项目,发现在进行make install时报错,错误信息如下:
1 /home/XXX/Qt/bin/qmake -install qinstall -exe /home/XXX/teststrip/aaa.h /home/XXX/teststrip/install/aaa.h 2 strip /home/XXX/teststrip/install/aaa.h 3 strip: /home/XXX/teststrip/install/aaa.h: file format not recognized 4 make: [Makefile:612:install_inc] 错误 1 (已忽略)
问题分析
查看Makefile文件,分析问题,发现
1 ####### Install 2 3 install_inc: first FORCE 4 @test -d $(INSTALL_ROOT)/home/XXX/teststrip/install || mkdir -p $(INSTALL_ROOT)/home/XXX/teststrip/install 5 -$(QINSTALL_PROGRAM) /home/XXX/teststrip/aaa.h $(INSTALL_ROOT)/home/XXX/teststrip/install/aaa.h 6 -strip $(INSTALL_ROOT)/home/XXX/teststrip/install/aaa.h
不知为何会多出strip。
错误排查
首先怀疑是pro写错了,先来验证pro正确性,原pro文件内容截取后如下:
HEADERS += aaa.h SOURCES += aaa.cpp main.cpp inc.files += aaa.h inc.path += $$PWD/install INSTALLS += inc
新增一段安装脚本
kk.files += bbb.h kk.path += $$PWD/install INSTALLS += kk
然后touch 文件bbb.h。重新qmake加make install:
/home/XXX/Qt/bin/qmake -install qinstall /home/XXX/teststrip/bbb.h /home/XXX/teststrip/install/bbb.h
bbb.h文件是正确的,打开Makefile文件,查看
install_kk: first FORCE @test -d $(INSTALL_ROOT)/home/XXX/teststrip/install || mkdir -p $(INSTALL_ROOT)/home/XXX/teststrip/install -$(QINSTALL) /home/XXX/teststrip/bbb.h $(INSTALL_ROOT)/home/XXX/teststrip/install/bbb.h
kk字段的install脚本是正确的,说明脚本写的是正确的。
进一步分析,为何文本的aaa.h文件会被处理为可执行文件(目标文件)?之所以说是将.h文件当作目标文件是因为安装命令中的strip,strip是用来给目标文件瘦身的,它用来删除目标文件中的符号表。
有了上述的分析之后,忽然想到查看一下文件的权限:
ls -l
发现果然是权限搞错了:
-rwxrwxr-x 1 XXX XXX 59 11月 23 08:35 aaa.h -rw-rw-r-- 1 XXX XXX 0 11月 23 11:28 bbb.h
修复aaa.h的权限
chmod -x aaa.h
重新qmake之后查看Makefile:
install_inc: first FORCE @test -d $(INSTALL_ROOT)/home/XXX/teststrip/install || mkdir -p $(INSTALL_ROOT)/home/XXX/teststrip/install -$(QINSTALL) /home/XXX/teststrip/aaa.h $(INSTALL_ROOT)/home/XXX/teststrip/install/aaa.h
重新make install,正确。至此,错误清除。
总结
注意文件权限引起的make Install错误。