Когда я добавляю флаг -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]"
, которого у меня нет, если я компилирую без оптимизации времени компоновки.
Как вы настраиваете -O3
?
Через gradle мне тоже кажется странным, что flto и O3 несовместимы.
Но как? Что вы печатаете? Какую переменную вы меняете?
Спасибо, что нашли время, я поместил соответствующую нативную конфигурацию сборки в этот файл: toppluva.com/misc/gradle_flto.txt Единственный параметр сборки -flto в части gradle.
Две части ответа:
Ошибка вызвана https://github.com/android-ndk/ndk/issues/721. Плагин Clang LTO просто не принимает -Os
или -Oz
. Это ошибка.
Okay, I might be really stupid, I suppose between 0 and 3 means 1 or 2 :)
На самом деле это потому, что вы не можете использовать общий cppFlags
для установки уровней оптимизации. Это соответствует CMAKE_CXX_FLAGS
, и вам нужно установить их в CMAKE_CXX_FLAGS_DEBUG
и CMAKE_CXX_FLAGS_RELEASE
(и/или их разновидности C). CMake имеет свои собственные значения по умолчанию для этих переменных, а командная строка построена как ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}
, поэтому по умолчанию ваш -O3
переопределяется.
Спасибо, это работает! Если кто-то еще борется с этим (и не осваивает CMake), добавьте set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -flto=full") в свой CMakeLists.txt
Хорошо, я могу быть действительно глупым, я полагаю, что между 0 и 3 означает 1 или 2 :)