我是QT新手,我很難理解如何在主函數執行前確定操作系統。我在這方面是一個完全新手,所以任何指導將不勝感激。在編譯期間確定操作系統
我想,以確定是否該程序在以下環境之一運行:
Windows
Unix
Linux
Mac
而且我將如何在主函數中使用這些數據?
非常感謝
我是QT新手,我很難理解如何在主函數執行前確定操作系統。我在這方面是一個完全新手,所以任何指導將不勝感激。在編譯期間確定操作系統
我想,以確定是否該程序在以下環境之一運行:
Windows
Unix
Linux
Mac
而且我將如何在主函數中使用這些數據?
非常感謝
您可以使用預處理器定義摸出代碼被編譯在什麼平臺上。
例如,要檢查,如果你使用的是Windows:
#if (defined (_WIN32) || defined (_WIN64))
// windows code
#endif
對於Linux:
#if (defined (LINUX) || defined (__linux__))
// linux code
#endif
...等等您感興趣的各平臺這樣,與您定位的平臺不相關的代碼將被刪除。
下面是一個使用這樣的代碼示例:
#include <iostream>
int main()
{
#if (defined (_WIN32) || defined (_WIN64))
std::cout << "I'm on Windows!" << std::endl;
#elif (defined (LINUX) || defined (__linux__))
std::cout << "I'm on Linux!" << std::endl;
#endif
}
感謝您的回覆。我還有一個問題:如果我在Linux機器上編譯您的示例,然後將該程序傳輸到Windows機器上。結果會不同,還是會顯示「我在Linux上!」?謝謝! – NSPredator
如果該程序是針對Linux編譯的,它將無法在Windows上運行:) – OMGtechy
對不起。但是,Qt程序肯定會在Windows和Linux上運行? – NSPredator
您可以使用預處理器宏與-DOPERATING_SYSTEM=<...>
,並用它來設置一個變量的值。
enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAX};
OperatingSystem os = OPERATING_SYSTEM;
它假設OPERATING_SYSTEM
被定義爲以上之一。
Qt本身爲Qt支持的不同平臺定義了預處理器開關。它們全部看起來像Q_OS_*
- *部分被不同的操作系統取代。對於你舉例來說,這將是:
Q_OS_WIN
,Q_OS_WIN32
或Q_OS_WIN64
(有幾個,Q_OS_WINCE
例如,但Q_OS_WIN
對於所有的Windows風格的操作系統定義)Q_OS_UNIX
Q_OS_LINUX
(請注意:Q_OS_UNIX
在Linux上定義過)Q_OS_MAC
(針對OSX和iOS),Q_OS_OSX
或Q_OS_MACX
所有這些plattform標題定義在qsystemdetection.h
。該文件包括幾乎所有不同支持的操作系統及其預處理器切換的列表。
感謝您確認Q_OS_UNIX是在Linux上定義的。 –
Q_OS_AIX
Q_OS_ANDROID
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IOS
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC
Q_OS_NETBSD
Q_OS_OPENBSD
Q_OS_OSF
Q_OS_OSX
Q_OS_QNX
Q_OS_RELIANT
Q_OS_SCO
Q_OS_SOLARIS
Q_OS_ULTRIX
Q_OS_UNIX
Q_OS_UNIXWARE
Q_OS_WIN32
Q_OS_WIN64
Q_OS_WIN
Q_OS_WINCE
Q_OS_WINPHONE
Q_OS_WINRT
所有的其他例子包括的要點,但我只想澄清:
#include <QtGlobal>
#include <QDebug>
enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAC};
#if (defined (Q_OS_WIN) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64))
OperatingSystem os = OS_WINDOWS;
#elif (defined (Q_OS_UNIX))
OperatingSystem os = OS_UNIX;
#elif (defined (Q_OS_LINUX))
OperatingSystem os = OS_LINUX;
#elif (defined (Q_OS_MAC))
OperatingSystem os = OS_MAC;
#endif
int main() {
switch(os) {
case OS_WINDOWS: qDebug() << "Windows"; break;
case OS_UNIX : qDebug() << "Unix"; break;
case OS_LINUX : qDebug() << "Linux"; break;
case OS_MAC : qDebug() << "Mac"; break;
default : qDebug() << "Unknown"; break;
}
}
正如在其他評論人提到,Unix的可以在Linux上進行定義,所以你也許需要一些其他的檢查有,但是你真的需要知道它是Unix還是Linux?
編譯代碼時出現以下錯誤:''OperatingSystem'沒有在函數中聲明一個類型int main'並且'os沒有在這個範圍聲明' – NSPredator
當在每個'OperatingSystem前面添加'static'會發生什麼os ...' –
我發現這個問題:你打錯變量'OperatingSytem'它應該是'OperatingSystem' – NSPredator
通常使用帶#defines的條件編譯,因爲必須爲每個OS重新編譯源代碼。 –
由於您是Qt新手:QT是QuickTime,Qt是C++庫,請務必在引用C++庫時使用正確的一個。 Qt也發音爲「cute」,而不是「Que-Tee」 –