重拾 C++

被迫上了 caffe 的贼船,我也很无奈。。只得把遗忘多年的 C/C++ 重新捋一遍。本博文从报错出发,只为记录一些林林总总的知识点。避免从 0 开始浪费大量时间。

一、fatal error: caffe.pb.h: No such file or directory     compilation terminated.

此错误一般由两类原因导致,其一是指定文件丢失,解决办法很简单,自行百度。其二是我遇到的 — 头文件没有包含在 g++ 编译路径中。

C/C++程序在 linux 下被编译和连接时,GCC/G++ 会查找系统默认的 include 和 link 的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。

solutions

  • 在g++ 中用一个option 来指定
g++  main.cpp-o main -I path/to/caffe.pb.h
  • 通过环境变量来设置,这样就可以不要在g++ 中来指定了
export CPLUS_INCLUDE_PATH=/usr/local/include/python/
g++ -o main main.cpp

以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。
二、int main(int argc,char *argv[])
argc:命令行总的参数的个数,即argv中元素的个数。
* argv[ ]:  字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数
argv[0]: 指向程序的全路径名(当前目录到程序)
argv[1]: 指向在DOS命令行中执行程序名后的第一个字符串。argv[2]: 指向第二个字符串
三、char** argv与char *argv[]区别

指针是个地址。
char *a: a的值包含字符型数据,取消对a的引用(*a)得到一个字符,
不取消引用得到一个字符串,printf(“%c”,*a)输出一个字符或者printf(“%s”,a)输出字符串;
char **a: a的值包含一个地址,该地址包含字符字符型数据,取消对a的引用(*a),得到该地址,再取消对该地址的引用(**a),得到一个字符,printf(“%c”,**a)输出一个字符printf(“%s”,*a)输出字符串;
char *a[]: a是一个数组,数组的元素是地址(地址其实就是指针),地址包含的值是字符型数据,printf(“%c”,*a[i])输出一个字符,printf(“%s”,a[i]))输出字符串;
char *a或char **a可以改变a的值,char a*[]不能改变a的值。

Share this to:
Posted in c++

发表评论

电子邮件地址不会被公开。 必填项已用*标注