Tôi có một số dự án được xây dựng bằng CMake và tôi muốn có thể dễ dàng chuyển đổi giữa sử dụng GCC hoặc Clang/LLVM để biên dịch chúng. Tôi tin rằng (hãy sửa lại cho tôi nếu tôi nhầm!) Rằng để sử dụng Clang Tôi cần phải thiết lập như sau:Chuyển đổi giữa GCC và Clang/LLVM bằng CMake
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")
Có một cách dễ dàng chuyển đổi giữa những điều này và các biến GCC mặc định, tốt nhất là như một hệ thống thay đổi toàn diện hơn là dự án cụ thể (nghĩa là không chỉ thêm chúng vào CMakeLists.txt của dự án)?
Ngoài ra, có cần sử dụng các chương trình llvm-*
thay vì mặc định của hệ thống khi biên dịch bằng cách sử dụng clang thay vì gcc không? Có gì khác biệt?
Tôi đã theo dõi câu trả lời của bạn và mọi thứ ngoại trừ 'CMAKE_USER_MAKE_RULES_OVERRIDE' hoạt động. Dường như tệp bị bỏ qua (tức là mặc dù 'CMAKE_C_FLAGS_RELEASE' được đặt thành' -O4' trong tệp ghi đè, tệp này hiển thị giá trị mặc định của '-O3 -DNDEBUG' trong cmake). – Rezzie
Lưu ý rằng phần lớn thông tin này được lưu trữ trong tệp CMakeCache.txt ở cấp cao nhất của cây xây dựng của bạn. Để chuyển đổi giữa gcc và clang, bạn nên có hai cây xây dựng hoàn toàn riêng biệt, và chỉ đơn giản là cd qua lại để "chuyển đổi" trình biên dịch. Khi một cây xây dựng được tạo ra với một trình biên dịch đã cho, bạn không thể chuyển đổi trình biên dịch cho cây dựng đó. – DLRdave
@DLRdave Sử dụng hai cây xây dựng riêng biệt là một ý tưởng hợp lý; một cái mà tôi đã không xem xét. Rất tiếc :) Tuy nhiên, ngay cả khi thực hiện nó trong thư mục 'src/build-clang' mới, các ghi đè sẽ bị bỏ qua. – Rezzie