使用CMake在GCC和Clang / LLVM之间切换
我有一些使用CMake构建的项目,我希望能够轻松地使用GCC或Clang / LLVM来编译它们。 我相信(如果我错了,请纠正我)要使用Clang,我需要设置以下内容:
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在检测到C和C ++编译器使用时CXX
环境变量CC
和CXX
:
$ export CC=/usr/bin/clang
$ export CXX=/usr/bin/clang++
$ cmake ..
-- The C compiler identification is Clang
-- The CXX compiler identification is Clang
编译器特定的标志可以通过将其放入系统范围的CMake文件并将CMAKE_USER_MAKE_RULES_OVERRIDE变量指向它来覆盖。 使用以下内容创建文件~/ClangOverrides.txt
:
SET (CMAKE_C_FLAGS_INIT "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG_INIT "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE_INIT "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
SET (CMAKE_CXX_FLAGS_INIT "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG_INIT "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE_INIT "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
后缀_INIT将使CMake用给定的值初始化相应的*_FLAGS
变量。 然后以下面的方式调用cmake:
$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt ..
最后强制使用LLVM binutils,设置内部变量_CMAKE_TOOLCHAIN_PREFIX
。 CMakeFindBinUtils
模块支持这个变量:
$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..
综合起来,你可以编写一个shell包装器来设置环境变量CC
和CXX
,然后用提到的变量覆盖调用cmake。
Ubuntu上的系统范围C ++更改:
sudo apt-get install clang
sudo update-alternatives --config c++
将打印这样的东西:
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/g++ 20 auto mode
1 /usr/bin/clang++ 10 manual mode
2 /usr/bin/g++ 20 manual mode
然后,只需选择铿锵声++。
您可以使用选项命令:
option(USE_CLANG "build application with clang" OFF) # OFF is the default
然后在if()s中包装clang编译器设置:
if(USE_CLANG)
SET (...)
....
endif(USE_CLANG)
这样它就会在gui配置工具中显示为cmake选项。
为了使系统在整个系统范围内,您当然可以使用环境变量作为默认值,或者留在Ferruccio的答案中。
链接地址: http://www.djcxy.com/p/24453.html上一篇: Switching between GCC and Clang/LLVM using CMake
下一篇: Compile other external libraries (without CMakeLists.txt) with CMake