【问题标题】:C++ identify running platform (Android, iOS, etc.)C++识别运行平台(Android、iOS等)
【发布时间】:2016-02-29 06:27:57
【问题描述】:

作为多平台项目(目前为止的 Android 和 iOS)的一部分,我们共享一个通用 C++ 代码库来满足数学和算法要求。

作为 Android 开发人员,我在使用同事在 iOS 项目中使用的标准库 (STL) 时遇到了几个问题。

在我的build.gradle > android.ndk 我使用:cppFlags += "-std=c++11"stl = 'gnustl_shared'

例如,我不能使用原始 STL 中的 std::nth_element()std::sort(),我必须包括:bits/algorithmfwd.hbits/stl_algo.h

我选择了include <bits/stl_algo.h>,到目前为止一切顺利。

问题是,我们共享这个代码库,我想知道我们是否可以使用 flags 来识别 运行平台 以便代码动态使用正确的 包括。

感谢您的帮助!

[更新 1]

正如@andreas-reiff in his answer 所注意到的,我不清楚我确实在寻找要在头文件中使用的标志,以便在编译时执行正确的包含(而不是在运行时)。

如前所述,目前的平台是 iOS 和 Android。哪些标志可以帮助我们识别这些平台?

【问题讨论】:

    标签: android c++ ios stl java-native-interface


    【解决方案1】:

    你混淆了编译时间和运行时间。

    1) 包含用于编译时,因此您可以区分这个 e。 G。通过构建配置,然后选择适当的包含。这也是正常的方式。此外,您可以交换一些文件,也可以使用 #ifdef 指令来实现仅在某些平台上可用的功能。

    2) 至于运行时间,从通用 C++ 中找出可能有点困难,我建议从调用代码中简单地注入该信息:必须有某个地方知道它在哪里运行,然后该代码可以在您的代码中设置一个属性,告诉它它在哪里运行。

    您可能想要选择 1),但已经适当地选择了您的库。

    【讨论】:

    • 感谢您的回复!是的,我想选择 1),因此我谈论“旗帜”,但我承认我的帖子太不清楚了。我会相应地更新它。
    • 您将在不同的环境中编译它们,即 XCode (iOS) 和 Gradle/Android Build。它们要么自己提供预处理器指令,要么您可以将它们指定为这两个单独构建的附加定义。
    【解决方案2】:

    如果您只想检查一次目标,您可能希望通过一个专用的标头包含 STL 标头。

    例如,创建一个文件stl_includes.h,其内容如下:

    #ifndef STL_INCLUDES_H
    #define STL_INCLUDES_H
    
    #ifndef TARGET_PLATFORM
    // Prevent builds without defined target
    #error Target platform not defined!
    #elif TARGET_PLATFORM == TARGET_IOS
    // Your iOS headers here
    #include <...>
    #elif TARGET_PLATFORM == TARGET_ANDROID
    // Your Android headers here
    #include <...>
    #else
    #error Invalid build target!
    #endif
    
    #endif
    

    这确保每个构建都必须定义一个有效的目标平台并使用正确的标头。未知或未定义的目标将不会编译。在一些全局标头中定义有效的构建目标,最好在专用 STL 标头之外的其他标头中定义,以便您也可以在其他平台特定功能中使用它们。

    【讨论】:

    • 太好了,我正在找那个!但是,我不知道哪些标志代表 iOS 和 Android。我也在寻找他们。谢谢!
    • @Mackovich 您必须在共享代码库的某处定义有效目标的值。然后每个目标构建必须#define TARGET_PLATFORM 具有合法值,或者在目标特定的全局包含的标头中,或者通过项目选项/生成文件,具体取决于您的工具链。只有您的项目知道什么是有效目标。您可以尝试依赖一些特定于构建环境的定义,但如果您的工具链或平台库发生变化,这很容易出现可移植性问题。
    • 但是如何定义这样的标志?我只是不明白它是如何工作的。我在哪里指定这个平台有这个标志,以便我以后可以检查当前标志?
    • @Mackovich 只需将-DTARGET_PLATFORM=1 添加到您项目的cppflags 以选择您定义的平台 1. 在全局标头中定义和记录合法值,并在您的代码中使用这些定义。 大多数编译器的预处理器定义的命令行语法与-D&lt;your macro name&gt;=&lt;value&gt;相同。
    • 好的,我想我明白了。在我的 build.gradle 文件中,我可以设置 CPPFlags。正如我的 OP 中所述,它目前是"-std=c++11"。所以这就是我应该能够定义一个标志的地方,对吧?
    【解决方案3】:

    根据this page,这是您需要的:

    #ifdef __ANDROID__
        // Android Headers
    #elif __APPLE__
        // iOS Headers
    #endif
    

    【讨论】:

    • 不错!但苹果的旗帜似乎只涉及 MacOS 操作系统。我知道 iOS 是基于它的,但我不完全确定它是否兼容。会寻找它。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多