recherche

Maison  >  Questions et réponses  >  le corps du texte

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

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

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

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

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

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

阿神阿神2803 Il y a quelques jours551

répondre à tous(2)je répondrai

  • PHP中文网

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

    你的理解基本正确。
    对于程序或框架如何判断自己在什么系统或版本(相同的系统版本不同Api也是有所不同的)下,这个很简单,不同的系统或版本都有自己的特征,可能是独特的宏定义,特定的标志位,或者直接有对应的函数获取。
    当然,目前平台虽然看似差别很大,但是逐渐已经形成了大家共同承认的一些规范,比如Windows、Linux、Unix目前都已经遵循了POSIX接口规范,这就使得他们中大部分的常用接口都是近似的,所以在跨平台框架里,这大部分的代码是可以共用的,只有少部分也极少用到的接口需要区分开分别来写。

    répondre
    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.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

    répondre
    0
  • Annulerrépondre