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错误。

原文地址:https://www.cnblogs.com/nuoforever/p/14023647.html