如何为Android编译C++14代码?

9

是否可以使用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可行)。


我已经使用NDK(R10c)一段时间了,使用的是C++14,所以它可以工作。我使用clang 3.4/3.5进行构建,并使用gnustl_static作为STL(我无法使用c++_static进行构建;我不记得具体原因)。我不确定我是否使用了-std=c++14std=c++1y,但我认为是1y - Michael
我尝试了你的设置,但仍然不起作用,我正在使用基于LLVM 3.6.0的clang 3.6。 - Crossfire
5个回答

6

我能够编译,但是当我尝试加载共享库时,它说二进制文件不是有效的ELF可执行文件。 - Alexander Haroldo da Rocha

3
如果有人需要回答这个问题,我已经在这里找到了答案。它被称为CrystaX,基本上是Android NDK的修改版本,允许针对C++14、Boost库以及具有其他功能的目标。

1

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

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

0
如果我将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++
当我使用iostream时也会出现相同的问题。但这只是一个警告(我正在使用NDK 10e),并且可以正常构建。该警告是“-Wextern-c-compat”,您可以像关闭其他警告一样关闭它。

我使用了 -werror,因此编译器将这个警告转换成了一个错误。 - Crossfire
好的。你可以关闭这个警告,或者继续删除werror标志。现在我只是显示警告。 - Daniel Ryan

0
我创建了一个使用本地cpp的Android项目,支持c++17:
在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

谢谢,


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接