Ошибка компоновщика при включении оптимизации времени соединения в NDK - PullRequest
0 голосов
/ 21 мая 2019

Когда я добавляю флаг -flto в мой проект NDK C ++, компоновщик выдает следующую ошибку: «Уровень оптимизации должен быть между 0 и 3», даже если мой уровень оптимизации явно установлен на 3 с помощью -O3.

Кто-нибудь знает, как решить эту проблему?

Флаги компилятора передаются через Gradle, который, насколько я понимаю, должен передавать флаги и компилятору Clang, и компоновщику.Когда я убираю флаг -flto, все работает нормально.

Примечания:

  • Я использую NDK 19.2 (последняя версия на тот моментЯ пишу это).

  • Я также получаю предупреждение "clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]", которого у меня нет, если я компилирую без оптимизации времени ссылки.

1 Ответ

1 голос
/ 23 мая 2019

Две части к ответу:

Ошибка вызвана https://github.com/android-ndk/ndk/issues/721. Плагин LTO Clang просто не принимает -Os или -Oz. Это ошибка.

Хорошо, я мог бы быть действительно глупым, я полагаю, что от 0 до 3 означает 1 или 2:)

Это на самом деле потому, что вы не можете использовать общий cppFlags для установки уровней оптимизации. Это соответствует CMAKE_CXX_FLAGS, и вам нужно установить их в CMAKE_CXX_FLAGS_DEBUG и CMAKE_CXX_FLAGS_RELEASE (и / или их разновидностях C). CMake имеет свои значения по умолчанию в этих переменных, и командная строка имеет вид ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}, поэтому ваш -O3 переопределяется по умолчанию.

...