Ошибка компоновщика при включении оптимизации времени компоновки в NDK

Когда я добавляю флаг -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]", которого у меня нет, если я компилирую без оптимизации времени компоновки.

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

Viktor Sehr 21.05.2019 20:48

Как вы настраиваете -O3?

Dan Albert 21.05.2019 23:59

Через gradle мне тоже кажется странным, что flto и O3 несовместимы.

Viktor Sehr 22.05.2019 00:08

Но как? Что вы печатаете? Какую переменную вы меняете?

Dan Albert 22.05.2019 00:13

Спасибо, что нашли время, я поместил соответствующую нативную конфигурацию сборки в этот файл: toppluva.com/misc/gradle_flto.txt Единственный параметр сборки -flto в части gradle.

Viktor Sehr 22.05.2019 11:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 048
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Ошибка вызвана 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

Viktor Sehr 24.05.2019 13:09

Другие вопросы по теме