Qt开发经验 --- 避坑指南(8)
文章目录
- @[toc]
- 1 编译器判断
- 1.1 判断编译器类型、编译器版本、操作系统
- 1.2 获取编译器版本信息
- 1.3 Qmake判断MSVC编译器版本
- 2 程序启动单进程
文章目录
- @[toc]
- 1 编译器判断
- 1.1 判断编译器类型、编译器版本、操作系统
- 1.2 获取编译器版本信息
- 1.3 Qmake判断MSVC编译器版本
- 2 程序启动单进程
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 编译器判断
1.1 判断编译器类型、编译器版本、操作系统
- 微软官网
Visual Studio 版本 | _MSC_VER |
---|---|
Visual Studio 6.0 | 1200 |
Visual Studio .NET 2002 (7.0) | 1300 |
Visual Studio .NET 2003 (7.1) | 1310 |
Visual Studio 2005 (8.0) | 1400 |
Visual Studio 2008 (9.0) | 1500 |
Visual Studio 2010 (10.0) | 1600 |
Visual Studio 2012 (11.0) | 1700 |
Visual Studio 2013 (12.0) | 1800 |
Visual Studio 2015 (14.0) | 1900 |
Visual Studio 2017 RTW (15.0) | 1910 |
Visual Studio 2017 版本 15.3 | 1911 |
Visual Studio 2017 版本 15.5 | 1912 |
Visual Studio 2017 版本 15.6 | 1913 |
Visual Studio 2017 15.7 版 | 1914 |
Visual Studio 2017 版本 15.8 | 1915 |
Visual Studio 2017 版本 15.9 | 1916 |
Visual Studio 2019 RTW (16.0) | 1920 |
Visual Studio 2019 版本 16.1 | 1921 |
Visual Studio 2019 版本 16.2 | 1922 |
Visual Studio 2019 版本 16.3 | 1923 |
Visual Studio 2019 版本 16.4 | 1924 |
Visual Studio 2019 版本 16.5 | 1925 |
Visual Studio 2019 版本 16.6 | 1926 |
Visual Studio 2019 版本 16.7 | 1927 |
Visual Studio 2019 v16.8、v16.9 | 1928 |
Visual Studio 2019 版本 16.10、16.11 | 1929 |
Visual Studio 2022 RTW (17.0) | 1930 |
Visual Studio 2022 版本 17.1 | 1931 |
Visual Studio 2022 版本 17.2 | 1932 |
//GCC编译器
#ifdef __GNUC__
#if __GNUC__ >= 3 // GCC3.0 以上//MSVC编译器
#ifdef _MSC_VER
#if _MSC_VER >=1000 // VC++4.0 以上
#if _MSC_VER >=1100 // VC++5.0 以上
#if _MSC_VER >=1200 // VC++6.0 以上
#if _MSC_VER >=1300 // VC2003 以上
#if _MSC_VER >=1400 // VC2005 以上
#if _MSC_VER >=1500 // VC2008 以上
#if _MSC_VER >=1600 // VC2010 以上
#if _MSC_VER >=1700 // VC2012 以上
#if _MSC_VER >=1800 // VC2013 以上
#if _MSC_VER >=1900 // VC2015 以上//Borland C++
#ifdef __BORLANDC__//Cygwin
#ifdef __CYGWIN__
#ifdef __CYGWIN32__//mingw
#ifdef __MINGW32__//windows
#ifdef _WIN32 //32bit
#ifdef _WIN64 //64bit
#ifdef _WINDOWS //图形界面程序
#ifdef _CONSOLE //控制台程序//Windows(95/98/Me/NT/2000/XP/Vista)和Windows CE都定义了
#if (WINVER >= 0x030a) // Windows 3.1以上
#if (WINVER >= 0x0400) // Windows 95/NT4.0以上
#if (WINVER >= 0x0410) // Windows 98以上
#if (WINVER >= 0x0500) // Windows Me/2000以上
#if (WINVER >= 0x0501) // Windows XP以上
#if (WINVER >= 0x0600) // Windows Vista以上//_WIN32_WINNT 内核版本
#if (_WIN32_WINNT >= 0x0500) // Windows 2000以上
#if (_WIN32_WINNT >= 0x0501) // Windows XP以上
#if (_WIN32_WINNT >= 0x0600) // Windows Vista以上
1.2 获取编译器版本信息
# your .pro file
# g++ 编译器(版本:9.3.0)
QMAKE_GCC_MAJOR_VERSION # gcc 主版本号(如:9)
QMAKE_GCC_MINOR_VERSION # gcc 次版本号(如:3)
QMAKE_GCC_PATCH_VERSION # gcc 修订版本号(如:0)# clang 编译器(版本:10.0.1)
QMAKE_CLANG_MAJOR_VERSION # clang 主版本号(如:10)
QMAKE_CLANG_MINOR_VERSION # clang 次版本号(如:0)
QMAKE_CLANG_PATCH_VERSION # clang 修订版本号(如:1)# apple clang 编译器(版本11.0.3)
QMAKE_APPLE_CLANG_MAJOR_VERSION # apple clang 主版本号(如:11)
QMAKE_APPLE_CLANG_MINOR_VERSION # apple clang 次版本号(如:0)
QMAKE_APPLE_CLANG_PATCH_VERSION # apple clang 次版本号(如:3)# msvc 编译器
QMAKE_MSC_VER # msvc _MSC_VER版本号 (如:1920)
QMAKE_MSC_FULL_VER # msvc _MSC_FULL_VER版本号(如:192027508)# icc 编译器(Intel C++ Compiler)
QMAKE_ICC_VER # icc 版本号
QMAKE_ICC_UPDATE_VER # icc 版本号
1.3 Qmake判断MSVC编译器版本
# 方法1
contains(QMAKE_COMPILER_DEFINES, _MSC_VER=1916) {message("msvc 2017")
}# 方法2
MSVC_VER = $$(VisualStudioVersion)
equals(MSVC_VER, 15.0){message("msvc 2017")
}# 方法3
greaterThan(QMAKE_MSC_VER, 1900){ # msvc编译器版本大于2015message(msvc 2017 $$QMAKE_MSC_VER)
}else{message(msvc 2015及以下版本)
}
2 程序启动单进程
-
方法1:使用文件锁
#include "widget.h" #include <QApplication> #include <QDebug> #include <QDir> #include <QLockFile> #include <QMessageBox>int main(int argc, char* argv[]) {// 定义锁文件的路径QString lockFilePath = "./your_application.lock";QLockFile lockFile(lockFilePath);QApplication a(argc, argv);// 尝试获取锁if (!lockFile.tryLock()){// qInfo() << "应用程序已在运行。";QMessageBox::warning(nullptr, QObject::tr("Application Running"), QObject::tr("应用程序已在运行。"));return 1; // 如果无法获取锁,退出程序}Widget w;w.show();return a.exec(); }
-
方法2:windows下创建互斥变量
#include "widget.h" #include <windows.h> #include <QApplication> #include <QDebug> #include <QDir> #include <QLockFile> #include <QMessageBox>int main(int argc, char* argv[]) {// 定义一个唯一的互斥对象名称LPCWSTR mutexName = L"Global\\MyUniqueApplicationMutex";// 创建或打开互斥对象HANDLE hMutex = CreateMutex(NULL, FALSE, mutexName);if (hMutex == NULL){qDebug() << "CreateMutex错误:" << GetLastError();return 1;}// 检查是否已有程序实例在运行DWORD dwLastError = GetLastError();if (dwLastError == ERROR_ALREADY_EXISTS){qDebug() << "应用程序的另一个实例已在运行。";CloseHandle(hMutex);return 1;}QApplication a(argc, argv);Widget w;w.show();return a.exec(); }