我有很多使用CMake構建的項目,我希望能夠輕鬆地在使用GCC或Clang/LLVM編譯它們之間切換。我相信(請糾正我,如果我錯了!),要使用鏘我需要設置如下:使用CMake在GCC和Clang/LLVM之間切換
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
是否有這些和默認GCC變量之間切換的簡單的方法,最好是作爲一個系統整個變化而不是項目特定的(即不是將它們添加到項目的CMakeLists.txt中)?
此外,使用clang而不是gcc編譯時,是否需要使用llvm-*
程序而不是系統默認值?有什麼不同?
我已經遵循了你的回答,除了'CMAKE_USER_MAKE_RULES_OVERRIDE'以外的所有內容都能正常工作。看起來文件被忽略了(即,儘管CMAKE_C_FLAGS_RELEASE在覆蓋文件中被設置爲「-O4」,它在cmake中顯示了「-O3 -DNDEBUG」的默認值)。 – Rezzie
請注意,大部分信息都緩存在構建樹頂層的CMakeCache.txt文件中。要在gcc和clang之間切換,你應該有兩個完全獨立的構建樹,並簡單地來回「切換」編譯器。一旦使用給定的編譯器生成構建樹,就無法切換該構建樹的編譯器。 – DLRdave
@DLRdave使用兩個獨立的構建樹是一個明智的想法;有一個我沒有考慮過。糟糕:)但是,即使在新的'src/build-clang'目錄中執行,覆蓋被忽略。 – Rezzie