[英]Linker error when enabling Link Time Optimization in NDK
當我將標志-flto
添加到我的 NDK C++ 項目時,鏈接器會發出以下錯誤:“優化級別必須介於 0 和 3 之間”,即使我的優化級別通過-O3.
有誰知道如何解決這個問題?
編譯器標志是通過 Gradle 傳遞的,據我所知,它應該將標志傳遞給 Clang 編譯器和鏈接器。 當我刪除-flto
標志時,一切正常。
筆記:
我正在使用 NDK 19.2(我寫這篇文章時的最新版本)。
我還收到警告"clang++.exe: warning: argument unused during compilation: '-Wa,--noexecstack' [-Wunused-command-line-argument]"
,如果我在沒有鏈接時間優化的情況下進行編譯,我就沒有這個警告。
答案分兩部分:
該錯誤是由https://github.com/android-ndk/ndk/issues/721引起的。 Clang 的 LTO 插件就是不接受-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
。
我也遇到了這個鏈接錯誤,但我通過不同的方式修復了。
我已經交叉編譯了一個具有 arm64 和 armv7 架構的 android 庫。 arm64 沒問題,但是遇到 armv7 的鏈接錯誤。 我發現它可以通過在我的 CMakeLists.txt 中注釋掉以下語句來修復:
if (${CMAKE_MAJOR_VERSION} GREATER_EQUAL 3 AND ${CMAKE_MINOR_VERSION} GREATER_EQUAL 9)
cmake_policy(SET CMP0069 NEW)
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_supported_output)
if (ipo_supported)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif ()
endif ()
上述 CMake 語句與 IPO 設置有關,似乎在為 android armv7 進行交叉編譯時會導致鏈接錯誤。
我不知道為什么不應該為 android armv7 啟用 IPO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.