linux下编译C++笔记
此篇为自我学习linux下C++编译过程遇到的各种坑的记录,并非教程,实属菜鸟,路过的大神朋友就不要继续往下看咯。
./configure 是什么,怎么编写configure.ac, Makefile.am
参考这个链接大型项目使用Autoconf/Automake完成编译配置 ,研究了两天也还是不是很明白,尤其是宏的生成这里。
make怎么指定自己添加的第三方库
使用gcc或g++命令时,指定第三方库的名字和位置。
假设要用到libm.so 这个函数库(.so是动态库,.a是静态库),那么gcc命令应该这么写:
gcc sin.c -lm -L/lib -L/usr/lib
- -l 是告诉gcc编译和链接的时候要用到函数库(lmn的小写l)
- m 是这个库的名字,lib和.so是它的扩展名
- -lm 则是使用libm.so这个函数库的意思。后面的-L则是它的所在的路径,表示在/lib和/usr/lib中去寻找
一般linux的系统函数库默认安装在/lib 或者/usr/lib 中,所以也可以不写。
不过有一些后来我们自己安装的第三方库,比如boost,一般我的习惯是不安装在系统目录下,而是安装在用户级目录下/usr/local/lib, 这个时候就要指定-L了。
/lib 存放内核级库文件
/usr/lib 存放系统级库文件
/usr/local/lib 存放用户级的库文件
在/usr/local 这个目录下有几个比较相关的目录,比如说我自己安装一个第三方库boost,我可以把源码解压到/usr/local/src中,把boost下的lib放在 /usr/local/lib(或者/usr/local/lib64)下,把boost中的include目录(包含定义的一些变量的头文件)放在/usr/local/include下。
这个include什么用呢?
还是上面sin.c 的例子,有头文件#include <stdio.h>
那这个stdio.h是存放在/usr/include下的,假设是其他的头文件,放在/usr/local/include下,则在gcc编译的时候要再加上-I(HIJK的大写I)参数:
gcc sin.c -lm -I/usr/include
./configure –prefix=/usr/local/python3
表示将python3 安装在目录/usr/local/python3下,当执行编译安装 make&make install之后,会自动在/usr/local下出现python3目录,在之后卸载的时候只要将/usr/local/python3这个目录删除就可以,移植到其他机器上只要将这个目录复制就可以。好神奇。而之前那个安装文件的目录安装完直接删除就可以了。
命令行 将文件前n行/后n行复制到另一个文件:
head -1000 exam.txt > exam_head1000.txt
tail -1000 exam.txt > exam_tail1000.txt