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. Linux中线程的挂起与恢复(进程暂停)

    http://www.linuxidc.com/Linux/2013-09/90156.htm 今天在网上查了一下Linux中对进程的挂起与恢复的实现,相关资料少的可怜,大部分都是粘贴复制.也没有完整 ...

  2. FindFirstVolume系列函数遍历驱动器,获取驱动器信息

    什么是“卷”?卷,又称为“逻辑驱动器”,是 NTFS, FAT32 等文件系统组织结构的最高层.卷是存储设备(如硬盘)上由文件系统管理的一块区域,是在逻辑上相互隔离的存储单元.一个磁盘分区至少包含一个 ...

  3. mormot 数据集和JSON互相转换

    mormot 数据集和JSON互相转换 uses SynVirtualDataSet, mORMotMidasVCL, SynCommons; procedure TForm1.Button1Clic ...

  4. C++11简要介绍

    概述  C++1x (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言.C++1x 不仅仅增强了 C++ 语言自身的可用性 ...

  5. DWZ(一):框架初了解

    DWZ富client框架(jQuery RIAframework),是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. DWZ富client框架设计目标是简单有用.扩展方便.高速开发. ...

  6. ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-ComInteropPart2(COM 互操作第二部分) 1.A,示例(Sample) ...

  7. linux内核分析笔记----上半部与下半部(下)

    接着上节的来,我们在上节说了软中断和tasklet,那这最后就是工作队列了哦.. 工作队列和前面讨论的其他形式都不相同,它可以把工作推后,交由一个内核线程去执行----该工作总是会在进程上下文执行.这 ...

  8. 【Hadoop】HDFS客户端开发示例

    1.原理.步骤 2.HDFS客户端示例代码 package com.ares.hadoop.hdfs; import java.io.FileInputStream; import java.io.F ...

  9. 总结对Docker这个东西的想法

    记得一开始的时候,还只能在一些网站上看到关于Docker零星的一些消息,之后的不久,有关Docker消息就遍布网络. 是什么因素让Docker火起来的? 或者说什么原因促使大家都对Docker感兴趣并 ...

  10. MapReduce初学习

    内容来源,工具下载:点此链接  点此链接 Mapreduce概述: MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题.MR是由两个阶段组成,Map和Reduce,用户只 ...