最近工作中遇到一些小问题,现在抽时间来总结一下。由于问题没什么主题,就题名杂记吧
VScode中#include的规则
之前在Windows的Visual Studio中基本不会考虑编译链接的问题,可是在linux下就得考虑这些问题。之前习惯将项目的所有头文件包含在stdafx.h中,然后所有文件包含stdafx.h这个文件,这样就避免反复添加头文件。可是在VSCode中会出现循环包含头文件的问题。例如stdafx.h中写有#include”A.h”,但A.h中也写了#include”stdafx.h”,那么这两个头文件包含彼此,就会出现循环添加的错误。
思考之后我打算这样安排头文件,stdafx.h中包含的是标准库等一些外部的头文件,而自己写的头文件不添加在stdafx.h中。因为这些标准库基本很多地方都会用,所以自己写的头文件都#include”stdafx.h”。而如果要使用自己写的头文件,就在对应的文件添加。当然对于一个类,cpp文件都会包含自己的头文件(可以不包含stdafx.h文件)。这样有时也难以避免重复包含,如果检查出重复包含的头文件,使用#ifndef—#define—#include—-#endif结构来解决。
顺便记一点,include的包含规则是,“”先在项目目录中搜索,之后和<>一样会按照这个顺序搜索
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
环境变量的设置
linux在启动终端时会运行很多脚本来添加环境变量,我在安装一些工具的过程中也会在这些文件中修改环境变量。这里记录一些我常用的用来修改环境变量的文件位置
~/.bashrc
/etc/bsah.bashrc
/etc/sudoers
/etc/profile
如果环境变量出了问题,应该首先在这几处修改。
简要说明这几个文件的区别
1) /etc/profile:此脚本是全局环境的设置,对系统中的每个用户都有效,每个用户登陆后都会立即执行/etc/profile脚本。因此,不管哪个用户登陆后都要执行的任务放在此脚本中。
2) ~/.bash_profile:它是用户家目录下私有环境的设置,只对某一个特定的用户有效,即某一个用户登录后会执行它自己相应家目录下的.bash_profile脚本,利用它用户可以进行个性化设置。
3) /etc/bashrc:对所有用户都有效,当打开shell时会执行此脚本,他保存的是系统bash shell的信息。
4) ~/.bashrc:对某一个特定的用户有效,当用户每打开一个shell时都会执行此脚本。
protoc的版本管理
caffe使用Google的protobuf来做数据的描述。一开始我不能翻墙,所以不能安装Google的protobuf。解决方案是使用annconda的conda install protobuf,从清华的镜像中下载。但这样是安装在anaconda中的,而不是Google的安装位置。后来不知道为什么,我的电脑上又有一套protobuf。可能是升级chrome浏览器时下载的。而且两者版本不同,这就导致了很多问题。我的版本管理管理方法是借鉴这篇文章:Caffe安装中多版本protoc选择问题。就是设置环境变量的顺序。
对.so或者.a文件找不到或者不支持
在debug的过程中如果遇到not available,not found等等,最好先去这个文件位置找找这个文件是不是真的存在。有时候只是因为版本差异,导致路径出了问题。我的方法是在其他位置寻找这个包,然后copy到对应的位置,或者用ln -s生成软连接。
LIBTIFF错误的纠正
在程序中使用caffe出现了错误
/usr/local/lib/libopencv_imgcodecs.so.3.3.1:对‘TIFFReadRGBAStrip@LIBTIFF_4.0’未定义的引用
这个错误应该是openCV在编译时的设置问题引起的。只要在cmake编译openCV时使用命令:
cmake -D BUILD_TIFF=ON ..
然后重新编译就可以了。