查过一点资料,现今的跨平台实现方法主要有两种,一种是“一次编译,到处运行”(就是java这种),还有一种是“一次编码,到处编译”
我现在主要有疑问的是第二种。
就拿C++语言来说,其本身是跨平台的,只要我们不调用特定系统平台的api,只用标准库,其本身是可以实现跨平台的。但是如果我们要调用系统api,那就肯定无法跨平台编译了。
所以各种跨平台框架应运而生,比如QT、cocos2d-x等等。他们都是做了一个系统平台无关的层,把各个系统的api封装起来,提供接口,然后在哪个平台下就调用哪个平台的api
首先我不知道上述我的说法有没有错误的地方,若有,还请大神们指正!
现在我还有一个疑惑就是,在哪个平台下就调用哪个平台的api是如何实现的,难道这些框架自己会判断自己处在什么操作系统下吗?那不然它怎么知道该调用哪个系统的api?还是说是别的方法原理来实现跨平台的?(比如把所有操作系统的api都放在框架的源代码里面封装起来,然后创建项目的时候选择哪个平台就行?)
我看cocos2d-x有好几个文件夹,分别对应各个平台(win32、linux、ios、Android等等),但文件夹里面就是个入口文件,不可能是整个系统的api都在里面
你的理解基本上都正確。
對於程式或框架如何判斷自己在什麼系統或版本(相同的系統版本不同Api也是有所不同的)下,這個很簡單,不同的系統或版本都有自己的特徵,可能是獨特的宏定義,特定的標誌位,或直接有對應的函數獲取。
當然,目前平台雖然看似差別很大,但是逐漸已經形成了大家共同承認的一些規範,比如Windows、Linux、Unix目前都已經遵循了POSIX接口規範,這就使得他們中大部分的常用介面都是近似的,所以在跨平台框架裡,這大部分的程式碼是可以共用的,只有少部分也很少用到的介面需要區分開來寫。
跨平台庫都是根據各平台的系統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中根據不同平台包含不同的檔案