簡體   English   中英

在 NDK 中啟用鏈接時間優化時出現鏈接器錯誤

[英]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_DEBUGCMAKE_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM