cmake工程使用distcc
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
解决方案
经过两次尝试,需求就很明显了
- /usr/lib/distcc 不能放在PATH最开始的位置,/usr/bin应放在开始位置,以便 /usr/lib/distcc/cc 能找到正确的cc
- 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的更多相关文章
- 常见的cmake工程做法
第一步,创建一个build目录存放cmake生成的中间文件: mkdir build 第二步,进入到build文件目录: cd build 第三步,cmake把代码文件生成一个makefile文件: ...
- CMake工程找不到相应的cuDNN版本的问题
(1) 去官网下载相应的版本,因为电脑之前安装的是 CUDA8. ,找跟 CUDA 版本兼容的 cuDNN 下载即可,我选择的是 cuDNN v7.(Deb) 和 cuDNN v7.1.4 Deve ...
- CMake 工程调用 Makefile 编译项目
本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上. 首先介绍项目文件结构,文件主要由三个目录组成 3rdParty include src 其中,3rdParty ...
- CMake生成VS2010工程相对路径和绝对路径问题说明
CMake生成VS2010工程相对路径和绝对路径问题说明 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 主要是使用CMake生成的VS2010的工程,最好不 ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- CMake的一些使用
1. 使用QT加载CMake工程 打开QT,"文件"->"打开文件或项目"->选中CMakeLists.txt文件,出现对话框,单击下一步,点击&q ...
- `fw服务端非完整` 工程开发初期的工作
前面写到了一些关于cocos2dx在开发中的一些模块以及一些解决方法,那些都属于本人的个人简介和个人倾向的解决方案.最近这几天我完善了一下ui解析的部分,当然也只是抽出一点点时间去做的这件事情.我添加 ...
- Say bye to CMake and Makefile
用了几年的CMake,最近想试着琢磨如何将C++应用的动态链接全部改成静态链接,发现还需要研究CMake的用法,进入CMake的文档, http://www.cmake.org/cmake/help/ ...
- CMake初步(2)
转自:<你所不知的OSG>第一章:CMake初步(2) http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1229& ...
随机推荐
- 高性能mysql读后感
1. 事务里的写操作,四种隔离级别,都会加排他锁. 2. 事务里的读操作,前三种隔离级别,不会加锁,最后一种隔离级别,会加共享锁. 3. 上面的写.读操作,都是隐式加的锁. 可以自己显示对读操作进行 ...
- JAVA Socket 连接时长
其实关于这个问题可能用到的人不会很多,不过我在这里还是说说. 正常很多人写socket通信时,都会直接通过new socket(IP,PORT)直接去链接服务器.其实这种做法也没有错误,但是若当服务器 ...
- Intellij IDEA错误识别.xml文件
转自原文Intellij IDEA错误识别文件 今天上午弄了一个多小时,对idea感到十分的沮丧,真是太不好用了,一点儿都不智能,而且有些地方,还被自动的配置错误,导致操作起来就像是脱缰的野马. 言归 ...
- 疑似checkpoint堵塞数据库连接
注:这个说法是不成立的,问题已经解决,但是无法正确的定位到具体什么原因:[20140702]奇怪的应用程序超时 背景: 开发通过应用程序的日志发现间歇性的出现,数据库连接超时 原因: 只能大概猜测,没 ...
- 还原数据库完整sq语句l
use master go declare @dbname varchar ( 20) set @dbname = 'QADB' declare @sql nvarchar ( 500) declar ...
- python3用pyqt5开发简易浏览器
http://python.jobbole.com/82715/ 在这篇教程中,我们会用 Python 的 PyQt 框架编写一个简单的 web 浏览器.关于 PyQt ,你可能已经有所耳闻了,它是 ...
- UVA-10603-Fill(BFS+优先队列)
There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not grea ...
- Centos6.5搭建RHCS集群-实现GFS+iSCSI网络共享存储
RHCS集群配置 需要用到的各组件功能:RHCS(Red Hat Cluster Suite):能够提供高可用性.高可靠性.负载均衡.存储共享且经济廉价的集群工具集合.LUCI:是一个基于web的集群 ...
- VR虚拟现实的工作原理,你知道多少?【转】
VR虚拟现实经过几年的预热,已经开始呈现爆发式增长,要了解VR虚拟现实,就需要了解其工作原理,了解工作原理之前,我们就需要弄清楚眼睛是如何看清事物的. 眼睛瞳孔后有晶状体,也就是眼珠子.眼睛的背面有感 ...
- JavaScript Array reverse 方法:颠倒数组中元素的顺序
在JavaScript中,Array对象的reverse()方法将颠倒(反转)数组中元素的顺序.arr.reverse()在原数组上实现这一功能,即,reverse()会改变原数组. 例1:将数组元素 ...