通常我们在本地编译库(opecv、pcl)等我们喜欢使用make -jN (N代表线程数)这样可以加速编译过程,
但是,这不一定是“线程安全”的,因为当某个线程在编译时,经常其他线程编译依赖本线程的结果,但是本线程编译
内容还没编译完全,导致报错。所以,使用多个线程编译时,我们通常使用“暴力编译法”,就是比如使用4个线程编译
make -j4 ,在编译进度30%时报错了,我们不清空之前的编译,而是继续make -j4 ,这时候就会发现前30%编译很快,
并且下次报错的地方和上次的不是同一个地方,且编译进度还在前进(>30%),我们就能大概判断是多线程编译的问题,
所以,会一直make -j4 知道编译达到100%,最后面再用单线程 make all 扫一遍(可能有边边脚脚没有编译到)。
更深一点点思考,make 也是使用g++之类的最后编译:
如下makefile里面的配置:
hello : hello.o
g++ -o"hello" hello.o
再执行上面的g++ 之前,make会去判断hello 和hello.o 的“新旧”程度,如果hello比hello.o“旧”,则一定会编译,
如果hello比hello.o“新”则可能不编译,也就是这种原理,使得“暴力编译法”可行(多线程编译,遇到错误,不是第一时间解决错误,而是先再执行命令看看,然后到100%)
-----欢迎拍砖指正