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

场景

      当编译软件使用了外部库,事先并不知道它的头文件和链接库的位置,使用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时:

qtswitch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值