2015-12-08 69 views
4

我是QT新手,我很難理解如何在主函數執行前確定操作系統。我在這方面是一個完全新手,所以任何指導將不勝感激。在編譯期間確定操作系統

我想,以確定是否該程序在以下環境之一運行:

Windows 
Unix 
Linux 
Mac 

而且我將如何在主函數中使用這些數據?

非常感謝

+1

通常使用帶#defines的條件編譯,因爲必須爲每個OS重新編譯源代碼。 –

+1

由於您是Qt新手:QT是QuickTime,Qt是C++庫,請務必在引用C++庫時使用正確的一個。 Qt也發音爲「cute」,而不是「Que-Tee」 –

回答

5

您可以使用預處理器定義摸出代碼被編譯在什麼平臺上。

例如,要檢查,如果你使用的是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 
} 
+0

感謝您的回覆。我還有一個問題:如果我在Linux機器上編譯您的示例,然後將該程序傳輸到Windows機器上。結果會不同,還是會顯示「我在Linux上!」?謝謝! – NSPredator

+0

如果該程序是針對Linux編譯的,它將無法在Windows上運行:) – OMGtechy

+0

對不起。但是,Qt程序肯定會在Windows和Linux上運行? – NSPredator

1

您可以使用預處理器宏與-DOPERATING_SYSTEM=<...>,並用它來設置一個變量的值。

enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAX}; 
OperatingSystem os = OPERATING_SYSTEM; 

它假設OPERATING_SYSTEM被定義爲以上之一。

3

Qt本身爲Qt支持的不同平臺定義了預處理器開關。它們全部看起來像Q_OS_* - *部分被不同的操作系統取代。對於你舉例來說,這將是:

  • 的Windows:Q_OS_WINQ_OS_WIN32Q_OS_WIN64(有幾個,Q_OS_WINCE例如,但Q_OS_WIN對於所有的Windows風格的操作系統定義)
  • Unix的:Q_OS_UNIX
  • 的Linux:Q_OS_LINUX(請注意:Q_OS_UNIX在Linux上定義過)
  • 的Mac:Q_OS_MAC(針對OSX和iOS),Q_OS_OSXQ_OS_MACX

所有這些plattform標題定義在qsystemdetection.h。該文件包括幾乎所有不同支持的操作系統及其預處理器切換的列表。

+0

感謝您確認Q_OS_UNIX是在Linux上定義的。 –

1

這很好documented in QtGlobals

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 
1

所有的其他例子包括的要點,但我只想澄清:

#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?

+0

編譯代碼時出現以下錯誤:''OperatingSystem'沒有在函數中聲明一個類型int main'並且'os沒有在這個範圍聲明' – NSPredator

+0

當在每個'OperatingSystem前面添加'static'會發生什麼os ...' –

+0

我發現這個問題:你打錯變量'OperatingSytem'它應該是'OperatingSystem' – NSPredator