Linux开发环境搭建
gcc、g++的安装
gcc和g++是GUN的C&C++编译器,这两个本质上区别不大,gcc默认下使用C编译器,g++默认使用C++编译器。
1 | yum install gcc |
编译流程
- 源文件生存可执行程序:
1 | >$ g++ helloworld.cpp -o helloworld |
GCC命令的编译选项:
参数 | 解释 |
---|---|
-ansi | 只支持ANSI标准的C语法。这一选项将进制GNU C的某些特色,例如asm或者typeof关键字 |
-S | 只激活预处理和编译,就是指把文件编译成为汇编代码 |
-c | 只编译并生成目标文件 |
-g | 生成调试信息。GNU调试器可利用该信息 |
-o FILENAME | 生成指定的输出文件。用在生成可执行文件时 |
-O0 | 不进行优化处理 |
-O或-O1 | 优化生成代码 |
-O2或-O3 | 进一步优化 |
-shared | 生成共享目标文件。通常用在建立共享库时 |
-static | 禁止使用共享连接 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-IDIRECTORY | 指定额外的头文件搜索路径DIRECTORY |
-LDIRECTORY | 指定额外的函数库搜索路径DIRECTORY |
-ILIBRARY | 链接时搜索指定的函数库LIBRARY |
-m486 | 针对486进行代码优化 |
-E | 只运行C预编译器 |
make和Makefile
make是一个批处理工具,本身其实没什么功能。make工具就根据Makefile中的命令进行编译和链接。其实Windows系统中也有这些步骤,只不过微软已经把这些嵌入到了编译器中,不需要程序员去关心。Linux系统也有一些IDE可以帮助我们完成这些工作,比如CMake。
makefile的作用
工程中可执行文件的产生过程如下:
- 配置环境(系统环境)
- 确定标准库和头文件的位置
- 确定依赖关系(源代码之间编译的依赖关系)
- 头文件预编译
- 预处理
- 编译
- 链接
- 安装
- 和操作系统建立联系
- 生成安装包
大型工程中需要确定代码之间的依赖关系(第三步),当依赖关系复杂的时候,make命令工具诞生了,而Makefile文件正是为make工具所使用的。Makefile描述了整个工程文件的编译顺序、编译规则。
make流程
假设我们有一个简单的demo,reply.h、reply.cpp两个文件定义了一个类,输出“helloworld”,main.cpp是主函数文件,生成类对象。这三个文件有依赖关系。我们编译的步骤如下:
- 写Makefile文件
1 | main: reply.o main.o //左侧main是目标,依赖右侧的两个文件 |
可以看到,先表明最终生成文件的依赖关系,然后生成。其次挨个写被依赖文件自身的依赖关系。从上往下是倒置的依赖关系。
- 用make命令
$ make
类似于批处理,make命令会去调用makefile文件,完成Makefile文件中的各项命令。
makefile文件格式
- makefile的基本规则:
1 | 目标(target)...: 依赖(prerequisites) |
注意:每个命令前必须是Tab字符。
makefile的简化规则:
- 变量定义: 变量 = 字符串
- 变量使用: $(变量名)
1 | //上面的makefile文件可以做如下简化: |
- 清空操作
1 | //在makefile文件中可以加上清理操作: |
执行$ make clean
命令后,可以根据makefile中定义的删除操作把文件删掉。
makefile的扩展用法
- make工程的安装和卸载
1 | TARGET = main |
- Makefile中的变量
1 | 一、用户自定义变量 |