QT 编写.pro .pri 对编译输出整理和标准化

2023-11-01

 文件主要是用于QT对区别不同编译器的文件输出,目前只写了 win , linux 和 mac 有项目需求再补充,   BUILD_OUTPUT_PATH 是最后的目录名称,

当QT安装了MSVC编译支持时,项目在选择的VS第一次编译或qmake时,会在项目目录中生成MSVC目录,并在MSVC目录中生成.sln等MSVC项目构建文件。

效果图

 在QT转换为MSVC的效果图, 可以直接用MSVC打开编译

 以下是完整的 pri, 如果想更好的效果,建议在每个pro的TEMPLATE后将其incoude,

#   文件主要是用于QT对区别不同编译器的文件输出,目前只写了 win  linux , mac 有项目需求再补充,
#   BUILD_OUTPUT_DIR_NAME 是最后的目录名称
#   文件后面的是设置输出到目标目录 DESTDIR  = $$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/
#
#   2022-02-24  63744457@qq.com
#   2022-02-25  63744457@qq.com
#   2022-02-28AM  63744457@qq.com   复制动态库到程序目录
#   2022-02-28PM  63744457@qq.com   增加 QT项目 转 MSVC功能
#   2022-03-07  63744457@qq.com    修改debug复制内部库异常
#   2022-03-12  63744457@qq.com    增加 __COMPILE_RELEASE__  __COMPILE_DEBUG__
#   2022-03-16  63744457@qq.com
#       DEFINES 加入项目路径 PROJECT_PATH=\\\"$$TARGET_PWD/../\\\"
#       重新定义 OBJECTS_DIR 输出路径
#   2022-03-16  63744457@qq.com
#       去除 QMAKE_POST_LINK因为太占资源, release编译时会自动生成create_qtenv.bat, 需要时才创建程序的QT运行环境
#       msvc强制为 /source-charset:utf-8 /execution-charset:utf-8
#       toLocal8Bit:Unicode编码
#       toLatin1:ASCII编码
#   2022-03-21  63744457@qq.com
#       修改 include 目录生成位置,在build目录中生成
#   2022-03-22  63744457@qq.com
#   加入 LIBS_SATAIC_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/libs_static"
#   2022-04-03  63744457@qq.com
#    __COMPILE_MSVC__ 加入版本号 2008 2010 2012 2013......
#   2023-06-03  63744457@qq.com
#       加入完善 linux
#   2023-06-14  63744457@qq.com
#       生成linux软件的运行脚本
#   2023-06-16  63744457@qq.com
#       生成win dug下软件的运行脚本
#   2023-06-19  63744457@qq.com
#       生成win release 下软件的运行脚本
#
#


TARGET_PWD=$$PWD
message( "------$${TARGET}":  "start------------------------------------------" )
CONFIG += qt
  #  message( $${TARGET}": QT_VERSION= "$${QT_VERSION} )
  #  message( $${TARGET}": MAKEFILE_GENERATOR= "$${MAKEFILE_GENERATOR} )
contains(QT_MAJOR_VERSION, 4): {
    DEFINES += nullptr=NULL
#    SYSTEMINFO = $${system("systeminfo")}
# #   message( $${TARGET}": SYSTEMINFO= "$${SYSTEMINFO} )
#    contains( SYSTEMINFO, "Windows\\\ 10" ):{
#         CONFIG += windows10
#    }
#    contains( SYSTEMINFO, "Windows" ):{ # CONFIG += windows10
#      #  contains( SYSTEMINFO, "x64-based" ):{QT_ARCH=x86_64 } else:{ QT_ARCH=i386}
#    }

}

#message( $${TARGET}": CONFIG= "$${CONFIG} )
#message( $${TARGET}": TARGET_PWD= "$$TARGET_PWD )
#message( $${TARGET}": QT_ARCH= "$$QT_ARCH )
#message( $${TARGET}": QT = "$${QT} )
#message( $${TARGET}": QMAKE = "$${QMAKE}  )
#message( $${TARGET}": QMAKE_CC = "$${QMAKE_CC}  )
#message( $${TARGET}": QMAKE_CXX = "$${QMAKE_CXX}  )
#message( $${TARGET}": QMAKESPEC = "$${QMAKESPEC}  )
#message( $${TARGET}": DEFINES= "$${DEFINES} )
#message( $${TARGET}": QT_ARCH= "$$[QT_ARCH] )
#message( $${TARGET}": QT_MAJOR_VERSION= "$${QT_MAJOR_VERSION} )
#unix:{
#message( $${TARGET}": UNAME = "$${system("uname --a")}  )
#}


DEFINES += PROJECT_PATH=\\\"$$TARGET_PWD/\\\"
BUILD_OUTPUT_DIR_NAME=""
COMPILE_TOOLS=""
win32:{
     BUILD_OUTPUT_DIR_NAME = "win"
#    message($${TARGET}":  ""win");
    contains( CONFIG, "mingw" ) || contains( MAKEFILE_GENERATOR, "mingw" ):{
 #   QMAKE_CXXFLAGS += -shared --output-def dlltest.def
        BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_mingw"
#        message($${TARGET}":  ""msvc");
        DEFINES += __COMPILE_MINGW__
        contains( CONFIG, "gcc" ):{
         #   message($${TARGET}":  ""msvc");
            DEFINES += __COMPILE_GCC__ __COMPILE_GNUC__
            COMPILE_TOOLS = win-g++ g++
        }
    } else {

        contains( CONFIG, "msvc" ): QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
        contains( CONFIG, "msvc" ): QMAKE_CFLAGS += /source-charset:utf-8 /execution-charset:utf-8
        contains( CONFIG, "msvc" ): QMAKE_CXX += /source-charset:utf-8 /execution-charset:utf-8

        contains( QMAKE_CXX, "g++" ) :{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_gxx"
            DEFINES += __GXX__
            DEFINES += __COMPILE_GCC__ __COMPILE_GXX__
            COMPILE_TOOLS = win-gxx
         } else:  contains( QMAKE_CC, "gcc" ) :{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_gcc"
            DEFINES += __GCC__
            DEFINES += __COMPILE_GCC__
            COMPILE_TOOLS = win-gcc
         }else: contains( CONFIG, "win32-msvc2017" ):{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc2017"
#            message($${TARGET}":  ""msvc2017");
            DEFINES += __COMPILE_MSVC2017__
            DEFINES += __COMPILE_MSVC__=2017
            COMPILE_TOOLS = win32-msvc2017
         } else {
            contains( CONFIG, "win32-msvc2015" ):{
                BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc2015"
#                message($${TARGET}":  ""msvc2015");
                DEFINES += __COMPILE_MSVC2015__
                DEFINES += __COMPILE_MSVC__=2015
                COMPILE_TOOLS = win32-msvc2015
             } else {
                contains( CONFIG, "win32-msvc2019" ):{
                    BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc2019"
#                    message($${TARGET}":  ""msvc2019");
                    DEFINES += __COMPILE_MSVC2019__
                    DEFINES += __COMPILE_MSVC__=2019
                    COMPILE_TOOLS = win32-msvc2019
                 } else {
                    contains( CONFIG, "win32-msvc2013" ):{
                        BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc2013"
    #                    message($${TARGET}":  ""msvc2013");
                        DEFINES += __COMPILE_MSVC2013__
                        DEFINES += __COMPILE_MSVC__=2013
                        COMPILE_TOOLS = win32-msvc2013
                     } else {
                        contains( CONFIG, "win32-msvc2008" ):{
                            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc2008"
        #                    message($${TARGET}":  ""msvc2019");
                            DEFINES += __COMPILE_MSVC2008__
                            DEFINES += __COMPILE_MSVC__=2008
                            COMPILE_TOOLS = win32-msvc2008
                         } else {
                             contains( CONFIG, "msvc" ):{
                                BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_msvc"
        #                        message($${TARGET}":  ""msvc");
                                DEFINES += __COMPILE_MSVC__=1
                                COMPILE_TOOLS = win32-msvc20xx
                            }
                        }
                    }
                }
            }
        }

        contains( CONFIG, "msvc_cross" ):contains( CONFIG, "package_manifest" ):contains( CONFIG, "winrt" ):{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_uwp"
#            message($${TARGET}":  ""msvc2017");
            DEFINES += __UWP__
         }

    }
}
else:unix:{
    message($${TARGET}":  ""unix linux")
        BUILD_OUTPUT_DIR_NAME = "lin"
#        contains( QMAKE_CC, "gcc" ) | contains( QMAKE_CXX, "g++" ) :{
#            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_gcc"
#            DEFINES += __GCC__
#            DEFINES += __COMPILE_GCC__
#         }

        contains( QMAKE_CXX, "g++" ) :{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_gxx"
            DEFINES += __GXX__
            DEFINES += __COMPILE_GCC__ __COMPILE_GXX__
            COMPILE_TOOLS = linux-gxx
         } else:  contains( QMAKE_CC, "gcc" ) :{
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_gcc"
            DEFINES += __GCC__
            DEFINES += __COMPILE_GCC__
            COMPILE_TOOLS = linux-gcc
         }

}
else:macx:{
    message($${TARGET}":  ""macx")
}



contains(QT_ARCH, x86_64) {
#    message($${TARGET}":  ""x86_64")
    DEFINES += __ARCH_X86_64__ __SYS64BIT__
    BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_x86_64"
} else {
    contains(QT_ARCH, i386) {
    #    message($${TARGET}":  ""x86")
        DEFINES += __ARCH_I386__  __ARCH_I686__ __SYS32BIT__
        BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_i386"
    } else {
        contains(QT_ARCH, arm64) { # 不知 arm64 对不对, 没测试
        #    message($${TARGET}":  ""arm64")
            DEFINES += __ARCH_ARM64__  __SYS64BIT__
            BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_aram64"
        } else {
            contains(QT_ARCH, arm32) { # 不知 arm32 对不对, 没测试
            #    message($${TARGET}":  ""arm32")
                DEFINES += __ARCH_X86_64__ __SYS64BIT__
                BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_x86_64"
            } else {
              contains(QT_MAJOR_VERSION, 4): {
                DEFINES += __ARCH_I386__  __ARCH_I686__ __SYS32BIT__
                BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_i386"
               } else{
                 error("---->I don't know what the environment is, so I need to supplement the settings.") # 不知是什么环境,要补充
                }
            }
        }
    }
}


CONFIG( debug, "debug | release" ): {
# message($${TARGET}":  ""MyDebug");
    BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_debug"
    CONFIG -= release Release
    CONFIG -= debug_and_release debug_and_release_target
    DEFINES +=  __COMPILE_DEBUG__
} else {
# 判断 profile 还是 release
     contains( CONFIG , "force_debug_info" ): { # profile
# message($${TARGET}":  ""MyProfile");
# message($${TARGET}":  ""force_debug_info");
        BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_profile"
    } else { # release
# message($${TARGET}":  ""MyRelease");
# message($${TARGET}":  "" not force_debug_info");
        BUILD_OUTPUT_DIR_NAME = $${BUILD_OUTPUT_DIR_NAME}"_release"
    }
    CONFIG -= debug Debug
    CONFIG -= debug_and_release debug_and_release_target
    DEFINES +=  __COMPILE_RELEASE__
}

contains(CONFIG,qt): BUILD_OUTPUT_DIR_NAME =$${BUILD_OUTPUT_DIR_NAME}"Qt"$${QT_VERSION}

# 2022-02-28 复制动态库到程序目录
# BUILD_OUTPUT_DIR_NAME = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}"
BUILD_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}"
BINS_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/bin"
LIBS_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/libs" # 动态库
LIBS_SATAIC_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/libs_static" # 动态库
# INC_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/include"
INC_OUTPUT_PATH = "$$TARGET_PWD/build/include"

DEPENDPATH += $$LIBS_OUTPUT_PATH

contains(TEMPLATE,lib) | contains(TEMPLATE,vclib): {
# message($${TARGET}":  "lib)
    contains( CONFIG , "staticlib" ):{ # 静态库
        LIBS_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/libs_static/"
    } else { # 动态库
        LIBS_OUTPUT_PATH = "$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/libs"
    }

    !exists($$INC_OUTPUT_PATH):{
        win32:{
            INC_OUTPUT_PATH = $$replace( INC_OUTPUT_PATH,"/","\\")
            system(mkdir $${INC_OUTPUT_PATH}"\\" )
        }else: unix:{
            system(mkdir -p $${INC_OUTPUT_PATH} )
        }else: maxc:{# 没用过这系统
            system(mkdir $${INC_OUTPUT_PATH}"\\" )
        }
    }

    message($${TARGET}":  "$${LIBS_OUTPUT_PATH})
    DESTDIR  = $${LIBS_OUTPUT_PATH}/
} else:contains(TEMPLATE,app)|contains(TEMPLATE,vcapp):{
#2022-02-28 复制动态库到程序目录
    #message($${TARGET}":  "app)
    #isEmpty($$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}"/libs"):  message($${TARGET}":  "isEmpty)
    exists($$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}"/libs"):{ # 复制动态库到程序目录
        #message($${TARGET}":  "exists)
            export($${LIBS_OUTPUT_PATH})
        win32:{
            #message($${TARGET}":  "copy)
            LIBS_OUTPUT_PATH = $$replace( LIBS_OUTPUT_PATH,"/","\\")
            BINS_OUTPUT_PATH = $$replace( BINS_OUTPUT_PATH,"/","\\")
            contains(CONFIG,qt):{
             contains( CONFIG, release ): {
                 #QMAKE_POST_LINK +=  "copy /B /V /Y $${LIBS_OUTPUT_PATH}\\*.dll  $${LIBS_OUTPUT_PATH}\\..\\bin" |
                  BAT_PATH += "copy /B /V /Y .\\libs\\*.dll  .\\bin\\" ^|
                }
          #   else: QMAKE_POST_LINK +=  "copy /B /V /Y $${LIBS_OUTPUT_PATH}\\*.dll  $${LIBS_OUTPUT_PATH}\\..\\bin"
            }  else: {
                #QMAKE_POST_LINK +=  "copy /B /V /Y $${LIBS_OUTPUT_PATH}\\*.dll  $${BINS_OUTPUT_PATH}"
                BAT_PATH += "copy /B /V /Y .\\libs\\*.dll  .\\bin\\"
            }
              #  QMAKE_POST_LINK +=  "copy /B /V /Y $${LIBS_OUTPUT_PATH}\\*.dll  $${BINS_OUTPUT_PATH}"
        } else: unix:{
            #QMAKE_POST_LINK +=  cp -f $${LIBS_OUTPUT_PATH}"/*.so"  $${LIBS_OUTPUT_PATH}/../bin
            BAT_PATH += cp -f ./libs"/*.so"  ./bin
        } else: maxc:{# 没用过这系统
        #    QMAKE_POST_LINK +=  cp -f $${LIBS_OUTPUT_PATH}"/"  $${LIBS_OUTPUT_PATH}/../bin
            BAT_PATH += cp -f ./libs"/*.so"  ./bin
        }
    }

#    system(mkdir $${TARGET_PWD}"\\libs" )
    DESTDIR  = $${BINS_OUTPUT_PATH}/

} else : {
    DESTDIR  = $${BINS_OUTPUT_PATH}/../
}


OBJECTS_DIR =  "$$OUT_PWD/$${BUILD_OUTPUT_DIR_NAME}/"
#MOC_DIR = "$$TARGET_PWD/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_moc"
#UI_DIR =  "$$TARGET_PWD/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_ui"
#RCC_DIR  =  "$$TARGET_PWD/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_rcc"
MOC_DIR = "$$TARGET_PWD/build/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_moc"
UI_DIR =  "$$TARGET_PWD/build/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_ui"
RCC_DIR  =  "$$TARGET_PWD/build/create/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}_rcc"

# 增加 QT 转 VS
contains( CONFIG, msvc ):!exists(./msvc/qt2vs_readme.txt):{
    MSVC_OUTPUT_PATH = $$replace( TARGET_PWD,"/","\\")
    system(mkdir $${MSVC_OUTPUT_PATH}\\msvc )
    system(echo "Only run QT to vs once. If you want to run again, delete this file!">>./msvc/qt2vs_readme.txt )
    system(echo "只运行一次QT转VS,如果要重新运行,删除本文件即可!">>./msvc/qt2vs_readme.txt )
    QMAKE_CXXFLAGS += -Gm
  #  CONFIG+=dll
    contains(TEMPLATE,subdirs): {
        #message(subdirs)
     #   system(qmake -r -spec win32-msvc2017 -tp vc -o ./msvc/) # 含子项目,指定VS版本
        system(qmake -r -tp vc  -o ./msvc/) # 含子项目
    } else : {
       # message(app)
        #system(qmake -spec win32-msvc2017 -tp vc  -o ./msvc/) # 不含子项目,指定VS版本
        system(qmake -tp vc -o ./msvc/) # 不含子项目
    }
}




#OBJECTS_DIR += $$OUT_PWD/../obj/$${BUILD_OUTPUT_DIR_NAME}/
#message($${TARGET}":  "$${OBJECTS_DIR});


# 在编译 release 后为程序添加相关的qt dll文件
CONFIG( release, "debug | release" ):{
    contains(CONFIG,qt):!contains(TEMPLATE,lib):!contains(TEMPLATE,vclib):!contains(TEMPLATE,subdirs):!contains(TEMPLATE,vcsubdirs):{

        QT_HOST_BIN = $$[QT_HOST_BINS]
                QT_HOST_BIN =$$replace( QT_HOST_BIN,"/","\\")
        exists($$[QT_HOST_BINS]/windeployqt.exe):  {
            contains( CONFIG , "force_debug_info" ):{ # profile
               # QMAKE_POST_LINK += $$[QT_HOST_BINS]/windeployqt.exe --release --force --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
            #    QMAKE_POST_LINK += $$[QT_HOST_BINS]/windeployqt.exe --release --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
                WINDEPLOYQT_COMMAND =  $$[QT_HOST_BINS]/windeployqt.exe --release --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
                BAT_QTPATH += $$[QT_HOST_BINS]/windeployqt.exe --release --qmldir ./qml/ --dir ./bin/ ./bin/$${TARGET}.exe
            } else { # release
                #QMAKE_POST_LINK += $$[QT_HOST_BINS]/windeployqt.exe --force --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
              #  QMAKE_POST_LINK += $$[QT_HOST_BINS]/windeployqt.exe --force --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
                WINDEPLOYQT_COMMAND =  $$[QT_HOST_BINS]/windeployqt.exe --force --qmldir $${TARGET_PWD} --dir $${DESTDIR} $${DESTDIR}$${TARGET}.exe
                BAT_QTPATH += $$[QT_HOST_BINS]/windeployqt.exe --force --qmldir ./qml/ --dir ./bin/ ./bin/$${TARGET}.exe
            }
                WINDEPLOYQT_COMMAND=$$replace( WINDEPLOYQT_COMMAND,"/","\\")
                #QMAKE_POST_LINK += $$WINDEPLOYQT_COMMAND
#                message("QT_HOST_BIN: " $$[QT_HOST_BIN]  )
#                message("QT_HOST_BIN: " $${QT_HOST_BIN}  )
#                message("QT_HOST_BIN: " $$QT_HOST_BIN  )

      #      message("BAT_PATH: " $$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat )


            !exists($$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat): {
                #D:\Qt\Qt5.12.2\5.12.2\mingw73_64\bin\qtenv2.bat
                #set PATH=D:\Qt\Qt5.12.2\5.12.2\mingw73_64\bin;D:\Qt\Qt5.12.2\Tools\mingw730_64\bin;%PATH%
                contains( CONFIG, "mingw" ):{
                    contains(QT_ARCH, x86_64): PATH=$$[QT_HOST_BINS];$$[QT_HOST_BINS]/../../../Tools\mingw730_64\\bin;^%PATH^%
                    else: PATH=$$[QT_HOST_BINS];$$[QT_HOST_BINS]/../../../Tools\mingw730_32\\bin;^%PATH^%
                    SYS_QT_PATH=$$replace( PATH,"/","\\")
                    system( "echo set PATH=$$SYS_QT_PATH >$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat" )
                }

                BAT_PATH +=$$replace( BAT_QTPATH,"/","\\")
                BAT_PATH +=  "^| copy /B /V /Y $$QT_HOST_BIN\\*work.dll  .\\bin\\"


                exists($$TARGET_PWD/libs/build/$${BUILD_OUTPUT_DIR_NAME}/libs): BAT_PATH +=  "^| copy /B /V /Y ..\\..\\libs\\..\\build\\$${BUILD_OUTPUT_DIR_NAME}\\libs\\*.dll  .\\bin\\"
                else: exists($$TARGET_PWD/libs/$${BUILD_OUTPUT_DIR_NAME}/libs): BAT_PATH +=  "^| copy /B /V /Y ..\\..\\libs\\$${BUILD_OUTPUT_DIR_NAME}\\libs\\*.dll  .\\bin\\"
                else: exists($$TARGET_PWD/libs): BAT_PATH += " ^| copy /B /V /Y ..\\..\\libs\\*.dll  .\\bin\\"
                else: exists($$TARGET_PWD/lib): BAT_PATH += " ^| copy /B /V /Y ..\\..\\lib\\*.dll  .\\bin\\"

                #message("QT_HOST_PREFIX : " $$[QT_HOST_PREFIX]  )
                #message("SYS_QT_PATH: " $$SYS_QT_PATH  )

                system( "echo cd /d %~dp0 >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat" )
                system( "echo %~d0 >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat" )
                system( "echo $$BAT_PATH >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/create_qtenv.bat" )
            }
        }

unix:!exists($$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.sh): {
    #SH_FILE =\\\"  #!/bin/bash

    #SH_FILE =\\\"\\$\\(dirname \\$"0"\\)\\\"
    #system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.sh" )

    SH_FILE ="current_dir="\\\"\\$\\(dirname \\$"0"\\)\\\"\\\n
    SH_FILE +="LD_LIBRARY_PATH="\\$"libdir:"\\${current_dir}"/libs:"\\$"{LD_LIBRARY_PATH:+:"\\$"LD_LIBRARY_PATH}"\\\n
    SH_FILE += "export LD_LIBRARY_PATH"\\\n
    SH_FILE += "sudo chmod a+x "\\$"{current_dir}/bin/"$${TARGET}\\\n
    SH_FILE += "exec  "\\$"{current_dir}/bin/"$${TARGET}

    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.sh" )
    system( "sudo chmod a+x $$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.sh" )

}



    }
}

#CONFIG( debug, "debug | release" ):
{
    !contains(TEMPLATE,lib):!contains(TEMPLATE,vclib):!contains(TEMPLATE,subdirs):!contains(TEMPLATE,vcsubdirs):{

        QT_HOST_BIN = $$[QT_HOST_BINS]
win32:!exists($$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat): {

    SH_FILE ="@echo off"
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    SH_FILE ="echo Setting up environment for Qt usage..."
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    #SH_FILE ="set current_app=%~dp0\"bin/"$${TARGET}".exe\""
    #system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    SH_FILE ="set PATH=$${LIBS_OUTPUT_PATH};%PATH%"
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

#    SH_FILE ="set PATH=%QT_HOST_BIN%;%QT_HOST_BIN%\\..\\..\\Tools\\mingw730_64\\bin;$${LIBS_OUTPUT_PATH};%PATH%"
#    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    SH_FILE = "cd /D %~dp0\"bin\""
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    SH_FILE ="start $${TARGET}.exe"
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

    SH_FILE = "exit"
    system( "echo $$SH_FILE >>$$TARGET_PWD/build/$${BUILD_OUTPUT_DIR_NAME}/$${TARGET}.bat" )

}
}
}


message("------$${TARGET}":  "config------------------------------------------")

message($${TARGET}":  TEMPLATE = "$${TEMPLATE})
message($${TARGET}":  QT_HOST_BINS = "$$[QT_HOST_BINS])
message($${TARGET}":  QMAKE_POST_LINK = "$${QMAKE_POST_LINK})

message($${TARGET}":  ""CONFIG = "$${CONFIG})
message($${TARGET}":  ""DEFINES" = $$DEFINES )
message($${TARGET}":  DESTDIR = "$${DESTDIR})

message($${TARGET}":  DEPENDPATH = "$${DEPENDPATH})
message($${TARGET}":  OBJECTS_DIR = "$${OBJECTS_DIR})
message($${TARGET}":  MOC_DIR = "$${MOC_DIR})
message($${TARGET}":  UI_DIR = "$${UI_DIR})
message($${TARGET}":  RCC_DIR = "$${RCC_DIR})
message($${TARGET}":  LIBS_OUTPUT_PATH = "$${LIBS_OUTPUT_PATH})

#CONFIG+=dll

message("------$${TARGET}":  "finish------------------------------------------")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 编写.pro .pri 对编译输出整理和标准化 的相关文章

随机推荐

  • Blender常用快捷键整理

    物体操作快捷键 即选中物体 G键 移动物体 R键 旋转物体 S键 缩放物体 移动 旋转或缩放物体时 按下X Y或Z键 按X Y或Z轴方向移动 旋转或缩放 TAB键 切换为编辑模式 CTRL A 弹出应用菜单 物体模式旋转缩放后应用旋转与缩放
  • 人工智能在通信领域的应用

    人工智能的出现使得各个行业都有了新的发展方向 通过和人工智能结合 使得自己的行业打破传统的方式 以一种新的姿态进入人们的视线中 现在我们都离不开通信技术 很多人对于人工智能给通信领域带来什么的改变 在这篇文章中我们会详细的介绍这一问题 大家
  • 基于opencv的车道线识别 方法二(极易实现(python))

    基于opencv的车道线识别 方法二 效果图 语言 平台 所需的库 步骤及原理 1 导入库 2 二值化 3 提取感兴趣区域 4 剔除噪点 5 找出值不为零的点 即车道线 并将其绘制在原图上 完整代码 效果图 语言 python 平台 pyc
  • 关于FFmpeg里的GPL和LGPL协议

    参考博文 谢谢博主的分享 http www cnblogs com findumars p 3556883 html GPL介绍 我们很熟悉的Linux就是采用了GPL GPL协议和BSD Apache Licence等鼓励代码重用的许可很
  • python并发编程学习笔记--单线程,多线程,多进程 day06

    Python并发编程是指同时处理多个任务的技术 包括单线程 多线程和多进程三种方式 1 单线程 单线程是指在一个进程中只有一个线程在执行任务的情况 虽然只有一个线程在执行任务 但可以使用异步编程模型来实现并发操作 从而达到提高程序效率的目的
  • 置信度传播算法(Belief Propagation)

    基础知识 条件概率 Conditional Probability 相互独立时 p A B p A 贝叶斯规则 贝叶斯网络 Bayesian Network 定了一个独立的结构 一个节点的概率仅依赖于它的父节点 贝叶斯网络适用于稀疏模型 即
  • 【Angular】——无限级下拉列表框

    前言 前段时间换了新框架 将前后端分离 对Angular2有点感兴趣 所以参与一起封装组件 在小5的帮助下 学会了 好多东西 这里总结下封装的无限级下拉列表框 dropdownlist ts import Component OnInit
  • IDEA 调试小技巧

    条件断点 循环中经常用到这个技巧 比如 遍历中 想让断点停在某个特定值 见上图 在断点位置 右击会弹出一个界面 在condition中填写断点条件 在调试的时候 断点会自动在断点条件 i 6 为 true时候停下 跳过为false的条件 回
  • Java对象与byte[]数组之间的相互转化,压缩解压缩操作

    原文 http blog csdn net NsdnResponsibility article details 51028739 comments 下面介绍一下java对象之间和byte 数组之间的相互转化 并对byte 数据进行压缩操作
  • 数学的回忆(零)——傅立叶

    一 什么是频域 从我们出生 我们看到的世界都以时间贯穿 股票的走势 人的身高 汽车的轨迹都会随着时间发生改变 这种以时间作为参照来观察动态世界的方法我们称其为时域分析 而我们也想当然的认为 世间万物都在随着时间不停的改变 并且永远不会静止下
  • 如何使用KubeSphere3.0的DevOps系统构建dotnet core应用

    如何使用KubeSphere3 0的DevOps系统构建dotnet core应用 因KubeSphere的DevOps系统官方未提供 net core的ci cd解决方案 需要自己进行DIY 现把实施过程记录下来 供需要的小伙伴自取 前提
  • FISCO BCOS 六、通过Caliper进行压力测试程序(及常见问题)

    目录 1 环境要求 第一步 配置基本环境 这里我使用的是Ubuntu20 04 第二步 安装NodeJS 第三步 部署Docker 第四步 安装Docker Compose 2 Caliper部署 第一步 部署 第二步 绑定 第三步 快速体
  • Jedis使用

    Jedis Jedis是Redis官方推荐的Java连接服务工具 Java语言连接redis服务还有这些SpringData Redis Lettuce 下载地址 https mvnrepository com artifact redis
  • MySQL left join优化

    问题描述 遇到了一个需要4个表连接查询的问题 数据量不是很大 两个表大概9000条数据 另外两个表大概几百条数据 但是每次查询时间都需要50秒左右的时间 SELECT FROM gzgdm gz gd region region LEFT
  • 类组件使用mobx实现数据修改以及请求数据

    src下创建新的共享数据文件test js import observable computed action autorun runInAction configure makeAutoObservable from mobx impor
  • 处理高并发的方法

    处理高并发 六种方法 1 系统拆分 将一个系统拆分为多个子系统 用dubbo来搞 然后每个系统连一个数据库 这样本来就一个库 现在多个数据库 这样就可以抗高并发 2 缓存 大部分的高并发场景 都是读多写少 那你完全可以在数据库和缓存里都写一
  • SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证

    前言 目前正在出一个SpringCloud进阶系列教程 含源码解读 篇幅会较多 喜欢的话 给个关注 前段时间拖更了 主要事情比较多和杂 不多废话了 直接给大家开整吧 本节重点是给大家介绍Oauth2 将会带大家从0到1搭建一个 Spring
  • 以太坊 p2p Server 原理及实现

    以太坊p2p原理与实现 区块链技术的去中心依赖于底层组网技术 以太坊的底层实现了p2pServer 大约可以分为这样三层 底层路由表 封装了kad路由 节点的数据结构以及计算记录 节点搜索 验证等功能 中层peer抽象 message开放发
  • PLC通信协议【西门子】PPI协议的读取与写入报文详解

    一 PPI协议通信过程 PPI通信协议是一种主从式的通信协议 上位机即PC机为主 PLC为从 通信开始由计算机发起 PLC予以响应 1 计算机按通信任务 用一定格式 向PLC发送通信命令 2 PLC收到命令后 进行命令校验 如无误 则向计算
  • QT 编写.pro .pri 对编译输出整理和标准化

    文件主要是用于QT对区别不同编译器的文件输出 目前只写了 win linux 和 mac 有项目需求再补充 BUILD OUTPUT PATH 是最后的目录名称 当QT安装了MSVC编译支持时 项目在选择的VS第一次编译或qmake时 会在