实践 Linux 编程之壹 - 构建
一般源代码提供的程序安装需要通过配置、编译、安装三个步骤;
- 配置做的工作主要是检查当前环境是否满足要安装软件的依赖关系,以及设置程序安装所需要的初始化信息,比如安装路径,需要安装哪些组件;配置完成,会生成 makefile 文件供第二步 make 使用;
- 编译是对源文件进行编译链接生成可执行程序;
- 安装做的工作就简单多了,就是将生成的可执行文件拷贝到配置时设置的初始路径下;
配置
查询可用的配置选项:
1 | ./configure --help |
配置路径:
1 | ./configure --prefix=/usr/local/snmp |
–prefix
是配置使用的最常用选项,设置程序安装的路径;
编译
编译使用 make 编译:
1 | make -f myMakefile |
通过 -f
选项显示指定需要编译的 makefile;如果待使用 makefile 文件在当前路径,且文件名为以下几个,则不用显示指定:
makefile Makefile
makefile 编写的要点
- 必须满足第一条规则,满足后停止
- 除第一条规则,其他无顺序
makefile 中的全局自变量
$@
目标文件名@^
所有前提名,除副本@+
所有前提名,含副本@<
一个前提名@?
所有新于目标文件的前提名@*
目标文件的基名称
要系统学习 makefile 可以参考 跟我一起学 makefile
CMake 工具
CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装 (编译过程)。他能够输出各种各样的 makefile 或者 project 文件。使用 CMake,能够使程序员从复杂的编译连接过程中解脱出来。它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以生成标准的构建文件,如 Unix/Linux 的 Makefile 或 Windows Visual C++ 的 projects/workspaces 。
编译依赖的库
makefile 编译过程中所依赖的非标准库和头文件路径需要显示指明:
1 | CPPFLAGS -I 标记非标准头文件存放路径 |
如果 CPPFLAGS 和 LDFLAGS 已在用户环境变量中设置并且导出(使用 export 关键字),就不用再显示指定;
1 | make -f myMakefile LDFLAGS='-L/var/xxx/lib -L/opt/mysql/lib' |
注意: 链接多库时,多个库之间如果有依赖,需要注意书写的顺序,右边是左边的前提;
g++ 编译
1 | $ g++ -o unixApp unixApp.o a.o b.o |
选项说明:
-o
: 指明生成的目标文件-g
:添加调试信息-E
: 查看中间文件
应用:查询宏展开的中间文件:
在 g++ 的编译选项中,添加 -E
选项,然后去掉 -o
选项 ,重定向到一个文件中即可:
1 | g++ -g -E unixApp.cpp -I/opt/app/source > midfile |
查询应用程序需要链接的库:
1 | $ ldd myprogrammer |
注解
关于 ldd 的使用细节,参见 ldd 查看程序依赖库
安装
安装就是将生成的可执行文件拷贝到配置时设置的初始路径下:
1 | $ make install |
其实 install 就是 makefile 中的一个规则,打开 makefile 文件后可以查看程序安装的所做的工作;