我正在使用 CMake 為我的 C 編譯啟用 IPO(程式間優化):
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
正如預期的那樣,這會導致-flto添加編譯器標志。但是,它還添加了-fno-fat-lto-objects: 這意味著生成的目標檔案將只有中間代碼,而不是正確編譯的中間代碼;這意味著聯結器必須支持我的系統編譯器的中間表示并且能夠識別 IPO/LT??O。
我沒有要求-fno-fat-lto-objects,也不想。我可以讓 CMake不添加此選項嗎?
uj5u.com熱心網友回復:
if(CMAKE_C_COMPILER MATCHES "GNU")
set(CMAKE_C_COMPILE_OPTIONS_IPO "-flto")
endif()
如何找到它:
導航到您的 CMake 安裝目錄,然后到
Modules,大部分東西都在那里。- 它
/usr/share/cmake/Modules在我的 Linux 系統上
- 它
找到您感興趣的字串或類似字串
在我的系統上,我這樣做:
$ grep fno-fat-lto-objects -r . ./Compiler/GNU.cmake: list(APPEND __lto_flags -fno-fat-lto-objects)
導航并檢查生成的檔案,使用字串的背景關系:
# '-flto' introduced since GCC 4.5: # * https://gcc.gnu.org/onlinedocs/gcc-4.4.7/gcc/Option-Summary.html (no) # * https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Option-Summary.html (yes) if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.5) set(_CMAKE_${lang}_IPO_MAY_BE_SUPPORTED_BY_COMPILER YES) set(__lto_flags -flto) if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7) # '-ffat-lto-objects' introduced since GCC 4.7: # * https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Option-Summary.html (no) # * https://gcc.gnu.org/onlinedocs/gcc-4.7.4/gcc/Option-Summary.html (yes) list(APPEND __lto_flags -fno-fat-lto-objects) endif() set(CMAKE_${lang}_COMPILE_OPTIONS_IPO ${__lto_flags})想出一個解決方法來實作這種 coe 的自定義行為。
uj5u.com熱心網友回復:
IMNSHO 認為這是一個 CMake 錯誤……我剛剛歸檔為:
https://gitlab.kitware.com/cmake/cmake/-/issues/23136
開發人員只是做出了錯誤的假設,即這是人們想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418552.html
標籤:
上一篇:三元條件控制
