您的位置:首页 > 编程语言 > Qt开发

解决使用cmake搜索QT包时冲突的问题

2018-03-29 08:54 513 查看

场景

当编译软件使用了外部库,事先并不知道它的头文件和链接库的位置,使用cmke中的find_package(< Name >)命令会在模块路径中寻找 Find< name >.cmake,这是一种快速查找库的方法。具体用法如下, 即可实现在使用cmake快速查找到Qt5.5.0的Widgets与Core 包:

...
#打开Qt的MOC功能和UI文件处理功能
set(CMAKE_AUTOMOC on)
set(CMAKE_AUTOUIC on)
set(CMAKE_AUTORCC on)
add_definitions(-DQT_BOOTSTRAPPED)
#查找Qt的库
find_package(Qt5 5.5.0 REQUIRED Widgets Core)

add_executable(text ${SOURCE_FILES})
qt5_use_modules(text  Widgets Core)


问题

但当Linux系统下存在两个QT包且版本号相同都为5.5.0,只是一个包用于交叉编译使用(Qt5.5.0-arm),其中一个用于Linux桌面开发应用(Qt5.5.0),此时将可能出现find_package无法正确查找到对应QT的情况(注:也可能是我不懂对应的find_package使用方法,如果有知道的望告诉,Thanks♪(・ω・)ノ)

脚本

我通过一个脚本,使用切换软连接的方法,例如当需要使用当Qt5.5.0-arm包时,删除/usr/local路径下的Qt5.5.0的软连接,并重新生成一个Qt5.5.0-arm的软连接,使find_package可以正确查找到需要的QT包。

该脚本中使用到了getopt,具体用法可以参考:https://www.cnblogs.com/yxzfscg/p/5338775.html

root@ubuntu:/bin# cat qtswitch

#!/bin/bash

#当前系统存在两种不同平台使用的QT包
#当cmake使用find_package方法查询包时可能会混淆
#该脚步用于解决QT包的链接关系

function switchHelp()
{
echo -e "\nUsage: qtswitch [options]\n" \
"\nOptions:\n" \
"  -a, --arm            switch ARCH = arm\n" \
"  -x, --x86            switch ARCH = x86\n" \
"  -w, --whole          switch ARCH = arm | x86\n"
}

if [ `whoami` != "root" ]; then
echo -e "权限不够"
exit 1
fi

if [ $# -lt 1 ]; then
switchHelp
exit 1
fi

#-o表示短选项, --long表示长选项, -n:出错时的信息 --:错误的选项字符串
TEMP=`getopt -o axw --long arm,x86,whole -- "$@"`

if [ $? != 0 ]; then
echo "Terminating..." >&2 ;
exit 1
fi
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$TEMP"

while true;
do
case "$1" in
-a | --arm)
#先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,
#由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄:
rm /usr/local/qt5.5.0 >/dev/null 2>&1
ln -s /opt/Qt5.5.0-arm /usr/local/qt5.5.0-arm >/dev/null 2>&1
echo -e "...\nuse arm success!"
shift;;
-x | --x86)
rm /usr/local/qt5.5.0-arm >/dev/null 2>&1
ln -s /opt/Qt5.5.0/5.5/gcc_64 /usr/local/qt5.5.0 >/dev/null 2>&1
echo -e "...\nuse x86 success!"
shift;;
-w | -whole)
ln -s /opt/Qt5.5.0-arm /usr/local/qt5.5.0-arm >/dev/null 2>&1
ln -s /opt/Qt5.5.0/5.5/gcc_64 /usr/local/qt5.5.0 >/dev/null 2>&1
echo -e "...\nuse arm | x86 success!"
shift;;
--)
shift
break;;
?)
switchHelp
exit 1;;
esac
done


使用

当需要切换Qt5.5.0时:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux shell