通常我们在本地编译库(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%)

-----欢迎拍砖指正

make,makefile,cmake“暴力编译法”的个人经验或理解。的更多相关文章

  1. AndroidStudio用Cmake方式编译NDK代码(cmake配置.a库)

    1.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

  2. Windows环境下使用Cmake ndk编译fdk-aac

     一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,下面是x264,网上说的很多都是几百年前的,我亲测完美可用 还是那句话 我能力有限,但是我希望我写的东西能够让 ...

  3. CMake 默认编译、链接选项

    查看cmake默认编译和链接的参数设置 CMakeLists.txt 文件内容: cmake_minimum_required(VERSION 3.2) message(STATUS "CM ...

  4. 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用)

    目录 基于TDengine-ver-1.6.4.4在windows 10下cmake+msys2编译(windows cgo 使用) 背景 下载地址 仓库地址 安装部署 msys2 安装 配置环境变量 ...

  5. 联盛德 HLK-W806 (十二): Makefile组织结构和编译流程说明

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  6. 2. CMake 系列 - 编译多文件项目

    目录 1. 编译不使用第三方库的项目 1.1 项目目录结构 1.2 相关代码 1.3 编译 2. 编译使用第三方库的项目 2.1 项目目录结构 2.2 相关代码 2.3 编译 1. 编译不使用第三方库 ...

  7. make makefile cmake qmake都是什么,有什么区别

    原文:https://www.zhihu.com/question/27455963 作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36 ...

  8. CMake方式编译

    [1]CMake基础 CMake是一种跨平台编译工具 CMake主要是编写CMakeLists.txt文件 通过CMake命令将CMakeLists.txt文件转化为make所需的Makefile文件 ...

  9. (二)我的Makefile学习冲动&&编译过程概述

    前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...

随机推荐

  1. GetPJData - uGetHttpData.pas

    function GetPJData(APage: Integer): string; var IdHTTP: TIdHTTP; url: string; paramsList: TStringLis ...

  2. ubuntu安装yaf

    ubuntu 下PHP安装yaf扩展,需要先安装其他软件 sudo apt-get install libncurses5-dev libpcre3-dev pcre-devel -y 然后再执行 p ...

  3. Ignite(三): Ignite VS Spark

    参考:https://www.itcodemonkey.com/article/9613.html gnite 和 Spark,如果笼统归类,都可以归于内存计算平台,然而两者功能上虽然有交集,并且 I ...

  4. 一些关于three.js的摘抄笔记

    加载多个geometry的方式: (可以利用three.js自带convert_obj_three.py文件将obj文件转换成json文件) function loadModel() { loader ...

  5. linux修改root密码

    或者是:sudo passwd root   提示输入新的密码.再确认输入一次密码回车,就可以完成root密码的修改.     更改成功,以后就用这个新的密码登陆到Linux系统中去

  6. JavaScript栈和队列

    栈和队列:JavaScrip没有专门的栈和队列,是[数组]模拟的 栈:一端封闭另一端打开 先进入的在最下面何时使用:永远使用最后进入数组的元素的时候,栈结构 队列:是一种遵从先进先出(FIFO)原则的 ...

  7. 前端使用nginx 达到前后分离的开发目的

    前言: 由于现在要开发一套基于python 的日志分析系统,设计到日志收集,分析,可视化输出,所以我使用前后端分离的做法.记录学习的过程: 00x1: 下载配置nginx:在E盘创建Service 目 ...

  8. 网络通信中tcp多客户端连接

    网络编程中的tcp实例太多了,自己也写了好几次(羞愧),今天在想一对一的TCP知道怎么写了,可是一对多的怎么办呢?服务器是如何知道要给那个发送数据呢?做开发的同学应该经常听说uid这个属性.可以为什么 ...

  9. C 语言 符合运算符

    复合赋值 5个算术运算符 + - * / % 可以和赋值运算符 = 结合起来形成符合运算符 += -= *= /= %= total += 5 total = total + 5 note:两个运算符 ...

  10. supersocket 遇到的Failed to initialize 和 log4net用法

    使用Bootstrap来通过配置启动SuperSocket的时候总是显示Failed to initialize!  , 官网配置中 <superSocket> <servers&g ...