搜尋

首頁  >  問答  >  主體

c++ - 当今各种框架的跨平台技术的实现原理?

查过一点资料,现今的跨平台实现方法主要有两种,一种是“一次编译,到处运行”(就是java这种),还有一种是“一次编码,到处编译”

我现在主要有疑问的是第二种。

就拿C++语言来说,其本身是跨平台的,只要我们不调用特定系统平台的api,只用标准库,其本身是可以实现跨平台的。但是如果我们要调用系统api,那就肯定无法跨平台编译了。
所以各种跨平台框架应运而生,比如QT、cocos2d-x等等。他们都是做了一个系统平台无关的层,把各个系统的api封装起来,提供接口,然后在哪个平台下就调用哪个平台的api

首先我不知道上述我的说法有没有错误的地方,若有,还请大神们指正!

现在我还有一个疑惑就是,在哪个平台下就调用哪个平台的api是如何实现的,难道这些框架自己会判断自己处在什么操作系统下吗?那不然它怎么知道该调用哪个系统的api?还是说是别的方法原理来实现跨平台的?(比如把所有操作系统的api都放在框架的源代码里面封装起来,然后创建项目的时候选择哪个平台就行?)
我看cocos2d-x有好几个文件夹,分别对应各个平台(win32、linux、ios、Android等等),但文件夹里面就是个入口文件,不可能是整个系统的api都在里面

阿神阿神2807 天前558

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:46:21

    你的理解基本上都正確。
    對於程式或框架如何判斷自己在什麼系統或版本(相同的系統版本不同Api也是有所不同的)下,這個很簡單,不同的系統或版本都有自己的特徵,可能是獨特的宏定義,特定的標誌位,或直接有對應的函數獲取。
    當然,目前平台雖然看似差別很大,但是逐漸已經形成了大家共同承認的一些規範,比如Windows、Linux、Unix目前都已經遵循了POSIX接口規範,這就使得他們中大部分的常用介面都是近似的,所以在跨平台框架裡,這大部分的程式碼是可以共用的,只有少部分也很少用到的介面需要區分開來寫。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 13:46:21

    跨平台庫都是根據各平台的系統API庫進行封裝的。
    各個作業系統都有特定的宏,然後程式碼裡面依照不同的宏呼叫不同平台的API。你可以參考一些優秀的開源函式庫的實作。
    例如 POCO的Foundation
    這裡面有大量的根據不同平台寫的各種實現。
    https://github.com/pocoproject/poco/blob/develop/Foundation/src/NamedMutex_Android.cpp
    https://github.com/pocoproject/poco/blob/develop/Foundation/src/NamedMutex_UNIX/Name .cpp
    https://github.com/pocoproject/poco/blob/develop/Foundation/src/NamedMutex_VMS.cpp
    https://github.com/pocoproject/poco/blob/develop/Foundation/src /NamedMutex_WIN32.cpp
    https://github.com/pocoproject/poco/blob/develop/Foundation/src/NamedMutex_WIN32U.cpp
    然後在NamedMutex.cpp中根據不同平台包含不同的檔案

    #if defined(POCO_OS_FAMILY_WINDOWS) && defined(POCO_WIN32_UTF8)
    #include "NamedEvent_WIN32U.cpp"
    #elif defined(POCO_OS_FAMILY_WINDOWS)
    #include "NamedEvent_WIN32.cpp"
    #elif defined(POCO_ANDROID)
    #include "NamedEvent_Android.cpp"
    #elif defined(POCO_OS_FAMILY_UNIX)
    #include "NamedEvent_UNIX.cpp"
    #else
    #include "NamedEvent_VMS.cpp"
    #endif

    回覆
    0
  • 取消回覆