【问题标题】:How to Compile C++14 code for Android?如何为 Android 编译 C++14 代码?
【发布时间】:2015-10-02 21:02:59
【问题描述】:

是否可以使用ndk10d 为Android 编译C++14 源代码?我已经尝试过 g++ 和 clang 编译器,但似乎 -std=c++14 -std=c++1y 标志不起作用。

如果我使用c++_static 作为我的 APP_STL,我会收到以下错误:

User/someone/Software/Android/android-ndk-r10d/platforms/android-17/arch-arm/usr/include/locale.h:55:1: error: empty struct has size 0 in C, size 1 in C++

编辑:我正在使用 Mac OSX 10.10.4 和 Xcode 6.3.2(能够为 iOS 编译 C++14)。

【问题讨论】:

  • 我已经使用 C++14 和 NDK (R10c) 有一段时间了,所以它确实有效。我正在使用 clang 3.4/3.5 构建,并将 gnustl_static 作为 STL(我无法使用 c++_static 构建;我不记得确切的原因)。我不确定我使用的是-std=c++14 还是std=c++1y,但我认为是1y
  • 我试过你的设置,但还是不行,我用的是clang 3.6(基于LLVM 3.6.0)

标签: android android-ndk clang c++14


【解决方案1】:

我用android-ndk-r12b-windows-x86_64,用-std=c++14编译成功

Android.mk

LOCAL_CPPFLAGS  = -Wall -std=c++14

【讨论】:

  • 我能够编译,但是当我尝试加载共享库时,它说二进制文件不是有效的 ELF 可执行文件。
【解决方案2】:

如果有人需要这个问题的答案,我已经找到了here

它被称为 CrystaX,基本上它是 Android NDK 的修改版本,允许以 C++14、Boost 库为目标并具有许多其他功能。

【讨论】:

    【解决方案3】:

    我在Application.mk 中使用了以下指令。通过 NDK_TOOLCHAIN_VERSION 切换到 clang 工具链解决了一堆问题。

    APP_CPPFLAGS += -std=c++14
    APP_STL := c++_static
    NDK_TOOLCHAIN_VERSION := clang
    

    【讨论】:

      【解决方案4】:

      如果我使用 c++_static 作为我的 APP_STL,我会收到以下错误:

      用户/某人/软件/Android/android-ndk-r10d/platforms/android-17/arch-arm/usr/include/locale.h:55:1: 错误:空结构在 C 中的大小为 0,在 C++ 中的大小为 1

      当我使用 iostream 时,我得到了同样的结果。但这只是一个警告(我使用的是 NDK 10e),它构建得很好。警告是“-Wextern-c-compat”,您可以像任何其他警告一样关闭它。

      【讨论】:

      • 我用的是-werror,所以编译器把这个警告变成了错误。
      • 对了。好吧,您可以关闭此警告或继续删除 werror 标志。现在我只显示警告。
      【解决方案5】:

      我为 c++17 创建了一个带有原生 cpp 的 android 项目:

      在 app/build.gradle 文件中:

      NDK:21

      android {
          compileSdkVersion 30
          buildToolsVersion "30.0.3"
      
          defaultConfig {
              applicationId "com.example.myapplication"
              minSdkVersion 16
              targetSdkVersion 30
              versionCode 1
              versionName "1.0"
      
              testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
              externalNativeBuild {
                  cmake {
                      cppFlags "-std=c++17" # this answer key
                  }
              }
          }
      }
      

      有一个演示,https://github.com/c0i/GameV4/commit/f9a3728f1aebc70d79dc9791cc9854ef5e41cae1

      谢谢,

      【讨论】:

        猜你喜欢
        • 2015-11-05
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 2022-07-16
        相关资源
        最近更新 更多