使用CMake (distcc, ccache)的编译器前缀命令
Using compiler prefix command(s) with CMake (distcc, ccache)
有一些实用程序通过添加命令作为前缀来使用现有的编译器(因此可以调用distcc cc -c file.c
而不是调用cc -c file.c
)。
当使用CMake编译器命令可以改变,但是我遇到了问题,试图使用distcc
,虽然这可能适用于任何命令前缀的编译器(ccache
太)。
-
CMake期望编译器是一个绝对路径,
所以将CMAKE_C_COMPILER
设置为/usr/bin/distcc /usr/bin/cc
,会给出一个错误:/usr/bin/distcc /usr/bin/cc is not a full path to an existing compiler tool.
- 将编译器设置为
/usr/bin/distcc
和
CMAKE_C_COMPILER_ARG1
或CMAKE_C_FLAGS
以/usr/bin/cc
开始在某些情况下工作,但CHECK_C_SOURCE_COMPILES
会失败(检查是否有一些方法支持这一点,甚至前缀CMAKE_REQUIRED_FLAGS
也不起作用)
我发现这样做的唯一方法是将命令包装在shell脚本中。
#!/bin/sh
exec /usr/bin/distcc /usr/bin/cc "$@"
虽然这工作,这将是很好的,能够使用CMake的编译器助手,而不必去通过shell脚本(给一些小的开销,当构建系统可以只使用命令前缀)。
我的问题是:
CMake可以直接使用编译器前缀命令(如distcc)吗?,没有shell脚本包装器?
从CMake 3.4.0开始有了CMAKE_
cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache /path/to/source
CCACHE_PREFIX=distcc make -j`distcc -j`
如果你有一个c++项目,请使用-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
。
或者,让你的CMakeLists.txt
智能并自动使用ccache,如果它可以找到:
#-----------------------------------------------------------------------------
# Enable ccache if not already enabled by symlink masquerading and if no other
# CMake compiler launchers are already defined
#-----------------------------------------------------------------------------
find_program(CCACHE_EXECUTABLE ccache)
mark_as_advanced(CCACHE_EXECUTABLE)
if(CCACHE_EXECUTABLE)
foreach(LANG C CXX)
if(NOT DEFINED CMAKE_${LANG}_COMPILER_LAUNCHER AND NOT CMAKE_${LANG}_COMPILER MATCHES ".*/ccache")
message(STATUS "Enabling ccache for ${LANG}")
set(CMAKE_${LANG}_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "")
endif()
endforeach()
endif()
提示:永远不要使用<LANG>_COMPILER_LAUNCHER
交叉编译。如果<LANG>_COMPILER_LAUNCHER
与distcc一起使用,则绝对编译器路径被发送到distcc,并且主机不使用交叉比较工具链!
你应该使用旧的方法,只是覆盖编译器路径:
export PATH=/usr/lib/distcc:$PATH
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 编译器如何在前缀和 postix 运算符之间进行区分?
- C++编译器如何扩展前缀和后缀运算符++()?
- “-wl”,编译器标志的前缀
- Android Cmake编译器正在生成带有额外前缀和符号后缀的.out文件
- 指示编译器忽略在#include中找到的标头前缀
- 编译器如何翻译后缀/前缀运算符
- 当使用L前缀(Visual C++编译器)时,如何#定义硬编码字符串
- eclipse中的交叉编译器前缀和路径
- 使用CMake (distcc, ccache)的编译器前缀命令
- 在源文件中指定include前缀与在编译器的搜索路径参数中指定include前缀的优缺点是什么