Включить исключение С++

Я пытаюсь сделать собственный код APP для Android. Собственный код находится в cplusplus. Всякий раз, когда я пытаюсь сделать, появляется следующая ошибка.

H236Plus.cpp:135: ошибка: обработка исключений отключена, используйте -fexceptions для включения

Как использовать -fexceptions для включения обработки исключений и где я могу это использовать?


person Gidiyo    schedule 10.07.2010    source источник
comment
Чтобы включить его с помощью ndk-build, используйте новую переменную LOCAL_CPP_FEATURES в вашем Android.mk, например: LOCAL_CPP_FEATURES += исключения   -  person hB0    schedule 08.11.2013


Ответы (8)


Вам нужно строить с помощью пользовательского NDK CrystaX. Он имеет полную поддержку libstdc++, RTTI и исключений. Как правило, это лучший инструмент для разработки Android, который я знаю.

person ognian    schedule 10.07.2010

Это зависит от того, какую среду выполнения вы используете. Если вы не используете системную среду выполнения и выполняете сборку с помощью ndk-build, вы добавляете любой из них в свой файл Android.mk:

  • LOCAL_CPP_FEATURES += исключения (рекомендуется)
  • LOCAL_CPPFLAGS += -fисключения

Кроме того, вы можете добавить следующую строку в файл Application.mk:

  • APP_CPPFLAGS += -fExceptions

Дополнительная информация находится в разделе docs/CPLUSPLUS-SUPPORT.html в папке NDK.

person Tundebabzy    schedule 06.12.2013

-fexception — это ключ компилятора. То, как вы его используете, зависит от настроек вашего компилятора. Какой компилятор вы используете? IDE? инструмент для сборки?

person EricSchaefer    schedule 10.07.2010
comment
НДК с cygwin. Все, что я сделал, это набрал make APP=project в cygwin в каталоге папки ndk. - person Gidiyo; 10.07.2010
comment
В этом каталоге должен быть Makefile. Это контролирует, как все компилируется. Это место для поиска переключателей компилятора. - person EricSchaefer; 10.07.2010
comment
Это -fexception или -fexceptions? - person IgorGanapolsky; 23.05.2017

Во флагах компилятора добавьте -fexception в ваш Makefile.

person DumbCoder    schedule 10.07.2010
comment
Это когда-нибудь работало? При этом у вас будет -fno-exceptions вместе с -fexceptions. - person ognian; 12.07.2010
comment
Конечно, вам нужно удалить -fno-exceptions, чтобы -fexceptions вступили в силу? - person marienke; 14.02.2013

Обратитесь к этому ответу @Tundebabzy, если вы используете ndk-build систему сборки.

Для CMake системы сборки

добавьте следующее в файл build.gradle уровня модуля:

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {

      // For ndk-build, instead use ndkBuild {}
      cmake {
        // Enables exception-handling support.
        cppFlags "-fexceptions"
      }
    }
  }
}
...

Для получения дополнительной информации см. эту ссылку.

person Pravin Divraniya    schedule 19.09.2017

с последней версией Android Studio мой build.gradle выглядит так:

model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        buildTypes {
            release {
                minifyEnabled false
                shrinkResources false
                proguardFiles.add(file("proguard-rules.txt"))
                signingConfig = $("android.signingConfigs.release")
            }
        }

        defaultConfig {
            applicationId "my.android.app"
            minSdkVersion.apiLevel 16
            targetSdkVersion.apiLevel 23
            versionCode 29
            versionName "my.latest.version"
        }

        ndk {
            moduleName "jni-utils"
            ldLibs.add("log")
            cppFlags.add("-std=c++11")
            cppFlags.add("-fexceptions")
            stl "gnustl_static"
        }
    }
    android.signingConfigs {
        create("release") {
            storeFile "C:\\Android\\Git\\MyProject\\keystore\\keystoreCommon"
            storePassword "put you password here"
            keyAlias "put your alias here"
            keyPassword "put your password here"
        }
    }
}
person Someone Somewhere    schedule 20.03.2016

Я решил эту проблему, добавив cFlags "-fexceptions" в раздел ndk скрипта build.gradle, например:

ndk {
    ...
    cFlags "-fexceptions"
}
person lnstadrum    schedule 09.07.2015

Просто примечание для тех, кто начал с одного из примеров NDK.

Они, как правило, устанавливают -fno-exceptions в свой CMakeLists.txt, вам нужно удалить его:

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Wall -Werror -fno-exceptions -frtti") 

Возможно, вы захотите проверить, хотите ли вы -Werror, пока вы это делаете.

person c z    schedule 12.11.2020