Cmake Error: could not load cache

背景

今天重新安装YouCompleteMe(使用Vundle),在其目录下运行

./install.py --all --system-boost --system-libclang

但是在编译的过程中提示

CMake Error: could not load cache

原因

不明

修正方法

删除目录下所有的cmake产生的文件,例如cmake_install、cmakecache和cmakefiles等,再重新编译即可。

参考

Cmake Error: could not load cache

使用git来跟踪Word文档

前言

最近在写毕业论文初稿,为了方便(以及自己并不是很熟悉LaTeX o(╯□╰)o)使用了Microsoft Word。但是总是有很多地方要修改,改来改去麻烦得要死,就想用git来跟踪一下,省的出现“第一版”、“第二版”“第一版第一版”……

下面是正题,主要说一下我们的操作步骤。如果你并不熟悉git,请移步廖雪峰的官方网站 – Git教程。除此之外,我还推荐你有一个GitHub的账号,这样你就可以推送到远端,如果你没有GitHub的账号,可以在这里Sign up(也就是注册)一下。

我们需要的材料:git、pandoc。

安装git与pandoc(如果已经有了,可以跳过这一步)

安装git

如果你使用Windows,那么需要从这里下载最新版的git,安装过程可以看这里;如果你使用Linux,那么可以从你的发行版的仓库直接安装。

安装pandoc

至于pandoc,如果你使用Window,可以从这里下载2.2.1版本的pandoc,安装的时候,一直保持默认选项即可;而如果你使用Linux,在很多发行版(包括Debian、Ubuntu、Slackware、Arch、Fedora、openSUSE以及gentoo)的软件仓库已经包含了,所以可以直接从软件仓库安装。如果你的软件仓库中没有,则可以从源码安装,这里说明了如何从源码安装

配置git 极其重要

打开git的配置文件(在Linux上,我们可以使用~/.gitconfig,也可以使用/etc下的config;在Windows上,我们需要找到安装目录,进入目录下的mingw64\etc\,找到gitconfig文件(这里推荐使用Notepad++如果没有的话,可以从这里下载64位的7.5.6版本的Notpad++))。我们打开我们找到的配置文件,打开之,在里面加上下面的一段话(请把中文引号替换为英文引号):

[ diff “pandoc”]
    textconv = pandoc --to = markdown
    prompt=false
[alias]
    wdiff = diff --word-diff = color --unified = 1

配置工程文件 极其重要

在配置了git之后,我们还需要配置我们的工程文件,这一步比较简单。打开我们的工程目录(也就是我们要跟踪的目录),新建一个”.gitattributes”文件(Linux或Mac下是这样,如果在Windows下,文件名应该是”gitattributes”,区别在于Linux和Mac下的文件名前有一个点,而Windows下的文件名没有)。然后打开我们新建的这个文件,写入下面的内容:

*.docx diff = pandoc

当然,如果你要跟踪其他格式的文件,需要把“docx”改成你要跟踪的文件,当然如果你要添加多种文件类型,按照上面的格式多加几行即可。
实际上可以跟踪的文件类型取决于pandoc能够支持的文件类型,在pandoc官网上,提到pandoc支持XHTML、HTML5、HTML、docx、ODT、XML、PPT以及EPUB等等,可以从这里看到pandoc可以支持的文件类型。

结语

实际上我们可以使用git跟踪很多文件,甚至Altium Designer的文件也可以(我最近做毕设,需要开板,这个也是我最近摸索出来的),不过我们需要做一点小修改,在保存PCB文档或SCH文档的时候,我们需要保存为文本文档格式(这样git才可以跟踪更改(因为git是依靠diff来跟踪修改的,而diff只能跟踪文本文档的变动)),而工程文件本身就是文本形式,所以无需变动。

其他类型的文件,大家也可以尝试一下。

编写无警告的代码

本文内容版权归原作者(作者e5Max)所有,我不对本文内容的真实性做任何保证。
原文地址:编写无警告的代码

今天把项目的Qt版本从Qt4.6.3升级到Qt4.8.4,重新编译项目代码的时候,特别关注了一下编译器的警告。于是找到《C++编程规范——101条规则、准则与最佳实践》翻了翻,重温了一下第1条 在高级别警告干净利落地进行编译。
如果编译器对某个构造发出警告,一般表明代码中存有潜在的问题。警告就好比代码的“肿瘤”,可能是良性的也可能恶性的——作为代码医生的我们不能对其视而不见。必须“把它弄清楚”,然后通过“改写代码以排除警告”!
典型的编译器警告示例:
1.”Unused function parameter”(未使用的函数参数):
编译器会对没有使用到的函数参数报告警告。如果确实不需要,那直接删除函数参数名就行了。
2. “Variable defined but never used”(定义了从未使用过的变量):
如果确实不需要,可以直接将之删除。 如果该变量的实例化是为了启动某项服务,则经常可以通过插入一个变量本身的求值表达式,使编译器不再报警。(这种求值不会影响运行时的速度)
3. “Variable may be used without being initialized”(变量使用前可能未经初始化):
这种警告通常意味着你的代码存在问题,请慎重处理之。
4. “Missing return”(遗漏了return语句)。:
这可能是一种好现象。即使你认为控制永远都不会运行到结尾或某个分支,则应该加上执行assert(false ) 的语句。
像下面这样(兼有注释作用的断言):

  default:  
     assert( !"should never get here!" );  // !“string” 的求值结果为false  
  
  1. “signed/unsigned mismatch”(有符号数/无符号数不匹配):
    通常需要插入一个显式的强制转换。
  2. “warning: type qualifiers ignored on function return type”(忽略了函数返回类型的类型限定符):
    通常是因为在函数前面的返回值面前添加了多余的 const 限定符。
    例如,const int getAge() const { return m_age; } ,最前面的const 是多余的,编译器会报告警告。
  3. “warning: deprecated conversion from string constant to ‘char*'”(不推荐的转化用法):
    函数原型:void setName(char *name);

    函数调用:setName(“personName”); // 编译器报告警告

释义:这是因为 char * 是一个指针,其背后的含义是:给我一个字符串,我可以修改它。

而如果我们传给函数一个“字符串常量”,这应该是没法被修改的。所以说,比较合理的办法是把参数类型修改为const char * ,而这个类型背后的含义是:给我一个字符串,我只要读取它(const意味着只读)。
8. “warning: “MAX_PATH” redefined” (重复定义) :

  #ifndef MAX_PATH
  #define MAX_PATH(260)
  #endif
  
  1. 第三方头文件。

  2. “auto-importing has been activated without –enable-auto-import specified on the command line”