distcc可以加速编译,但是遇到cmake可能就需要处理下。

问题

distcc在 /usr/lib/distcc 中放了各编译器的soft link(如cc/gcc等等),如果 /usr/lib/distcc 放到PATH最开始那么就会被先找到,不过我没有这样做,而是临时使用CC和CXX,如下

distcc-pump make -j$(distcc -j) CC="distcc cc"

但是对于cmake来说,cmake在configure的时候记录了编译器的绝对路径,编译命令是类似 /usr/bin/cc -o -c,所以distribute根本就不会发生

尝试1

既然是这样,那理所当然是应该把 /usr/lib/distcc 放到PATH最开始,这样 cmake就会记录 /usr/lib/distcc/cc 作为编译器,一切都很好,直到cmake尝试用这个编译器编译点代码(用于检测编译器的特性),编译就会报错(无法编译过去)。手动在这种环境就尝试编译,会提示没有使用distcc-pump,此时若使用 distcc-pump /usr/lib/distcc/cc 来手动编译是可以的。

尝试2

于是,我大胆的猜测下,把 /usr/lib/distcc 放到PATH最开始,并且 distcc-pump cmake ..,肯定就可以了,很不幸,这次cmake找到的居然是 /usr/bin/cc

通过 man distcc-pump,我发现可以使用 distcc-pump --startup来看看给后续命令的环境变量,它居然又把 /usr/bin加到了/usr/lib/distcc之前,再运行后续命令。我思考了下,问题应该是这样的, 当/usr/lib/distcc 放到PATH最开始时,cc被link到 distcc,当实际运行时,distcc并不知道cc在哪里,所以它需要把/usr/bin放到最开始,来找到真正的cc的位置,不管怎样,用 /usr/lib/distcc/cc 编译文件时, /usr/lib/distcc 是不能在PATH最开始的位置,否则编译出错,但我们又希望cmake找到 /usr/lib/distcc/cc

解决方案

经过两次尝试,需求就很明显了

  1. /usr/lib/distcc 不能放在PATH最开始的位置,/usr/bin应放在开始位置,以便 /usr/lib/distcc/cc 能找到正确的cc
  2. cmake 应找到 /usr/lib/distcc/cc,而不是 /usr/bin/cc

既然 /usr/lib/distcc 不能放在PATH最开始,又要让cmake使用 /usr/lib/distcc/cc,那只能是手动指定了,如下

cmake -DCMAKE_C_COMPILER=/usr/lib/distcc/cc -DCMAKE_CXX_COMPILER=/usr/lib/distcc/c++ ...

这样 /usr/lib/distcc/cc 在运行时, /usr/bin 在PATH的最开始,它也能正确调用真正在 /usr/bin/cc 去执行编译

cmake工程使用distcc的更多相关文章

  1. 常见的cmake工程做法

    第一步,创建一个build目录存放cmake生成的中间文件: mkdir build 第二步,进入到build文件目录: cd build 第三步,cmake把代码文件生成一个makefile文件: ...

  2. CMake工程找不到相应的cuDNN版本的问题

    (1) 去官网下载相应的版本,因为电脑之前安装的是 CUDA8. ,找跟 CUDA 版本兼容的 cuDNN 下载即可,我选择的是 cuDNN v7.(Deb) 和  cuDNN v7.1.4 Deve ...

  3. CMake 工程调用 Makefile 编译项目

    本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上. 首先介绍项目文件结构,文件主要由三个目录组成 3rdParty include src 其中,3rdParty ...

  4. CMake生成VS2010工程相对路径和绝对路径问题说明

    CMake生成VS2010工程相对路径和绝对路径问题说明 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 主要是使用CMake生成的VS2010的工程,最好不 ...

  5. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  6. CMake的一些使用

    1. 使用QT加载CMake工程 打开QT,"文件"->"打开文件或项目"->选中CMakeLists.txt文件,出现对话框,单击下一步,点击&q ...

  7. `fw服务端非完整` 工程开发初期的工作

    前面写到了一些关于cocos2dx在开发中的一些模块以及一些解决方法,那些都属于本人的个人简介和个人倾向的解决方案.最近这几天我完善了一下ui解析的部分,当然也只是抽出一点点时间去做的这件事情.我添加 ...

  8. Say bye to CMake and Makefile

    用了几年的CMake,最近想试着琢磨如何将C++应用的动态链接全部改成静态链接,发现还需要研究CMake的用法,进入CMake的文档, http://www.cmake.org/cmake/help/ ...

  9. CMake初步(2)

    转自:<你所不知的OSG>第一章:CMake初步(2) http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229& ...

随机推荐

  1. Exercise02_11

    import javax.swing.JOptionPane; public class Population{ public static void main(String[] args){ int ...

  2. microsoft visual studio遇到了问题,需要关闭

    http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=13821 装上这个补丁: WindowsXP-KB971513-x86-CH ...

  3. JSON.parse(str),JSON.stringify(a)

    1.JSON.parse(str),字符串转换成对象 var str = '{"name":"huangxiaojian","age":&q ...

  4. DL380 G6 BIOS刷新方法

    bios下载地址SP44873.exe (5.9 MB) http://h20000.www2.hp.com/bizsupport/TechSupport/SoftwareDescription.js ...

  5. centos selinux学习记录

    SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明 ...

  6. mongodb权限管理(转)

    Mongodb 预定义角色 Mongodb 中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作. 数据库用户角色 (所有数据库都有) read 用户可以读取当前数据库的数 ...

  7. unity 部分obj不接受后处理

    考虑了很多方案,比如渲染次序和mask(stencilebuffer) 渲染次序 sorting order(深度) renderer都有的属性能开放出来,sprite renderer原本就开放在i ...

  8. c# word 操作

    public class WordOperate { #region 新建Word文档 /// <summary> /// 动态生成Word文档并填充内容 /// </summary ...

  9. js获取url參数值的两种方式具体解释

    有个url例如以下: http://passport.csdn.net/account/login? from=http%3a%2f%2fwrite.blog.csdn.net%2fpostedit ...

  10. Sublime Theme

    Package Control Messages======================== Theme - Spacegray----------------- Thanks for insta ...