编译的过程
gcc、g++编译器
gcc
编译c、cpp
文件说明1、gcc会将c、cpp文件分开编译处理
2、由于gcc在链接的时候不能链接c++库,必须使用-lstdc++选项进行链接
3、gcc在编译C文件时,可使用的预定义宏是比较少的
4、gcc在编译cpp文件时,加入一些额外的宏。比如#define __cplusplus 1
g++
编译c、cpp
文件说明1、g++会将c、cpp文件统一当作cpp文件进行处理,会加一些宏,比如
#define __cplusplus 1
,来通过extern “C”来选择使用c语法编译
2、g++在链接的时候会自动链接标准库
gcc、g++
严格来说并不是具体的编译器,真正负责编译 C 代码的程序叫做cc1
,负责编译 C++ 代码的程序叫做cc1plus
。总的来说,使用带cpp的最好使用g++进行编译。
gcc、g++
操作选项(以GNU
编译器为准)
-E
预处理选项,生成.i
文件
-S
编译选项,生成.s
汇编文件
-c
汇编选项,将汇编文件编译成二进制文件
-o
生成可执行目标文件选项
-I
(大写的i
) 将设置增加#include <>
标准库的查找目录
-g -ggdb
两者都生成调试信息,只是-ggdb
生成的更加丰富,且只供gdb
调试工具使用,而-g
是原生的调试信息,可以通过g1、g2、g3
来打开一些调试信息,可供其它调试工具使用。
-w
忽略编译时的警告信息
-W 、-Wall
-Wall
:编译过程中打印所有的警告,-W
:只显示编译器认为会出现错误的警告。
-Werrors
警告转换为错误。
-D
后面跟宏定义,可以是-DNUM
或者DNUM=3
-U
取消定义,-UNUM
-M、-MM
生成头文件关联信息,其中-MM
不包括标准库的,后面加D,将生成信息导入.d
文件
-O
编译器的优化选项的4个级别,-O0表示没有优化,-O1为最基本优化等级,-O3优化级别最高,-O2,推荐优化等级,提高代码性能的同时,不会增加太大的体积和编译时间。
-static
只能使用静态库,编译出来的可执行文件较大,可以直接执行,不需要链接库
-share
尽量使用动态库(默认),编译出来的可执行文件比较小,执行的时候用到动态库,需要链接动态库
-fPIC
共享库代码段复用,代码段安全访问的目的,编译动态库时用到
-L
指定链接库的路径,LD_LIBRARY_PATH
:此库文件不在缺省目录下 /lib和/usr/lib,那么就需要指定环境变量LD_LIBRARY_PATH。
-l
(小写的L
)指定要链接的库名
-Wl
传递以逗号分隔的到链接器
-Wa
传递以逗号分隔的到汇编程序
-Wp
传递以逗号分隔的到预处理器
-pthread、-lpthread
链接线程库,pthread相比于lpthread更为新的版本。向后兼容,线程安全(定义了-D_REENTRANT 宏)
-rpath
程序运行时去rpath指定路径去寻找依赖库。程序链接时隐式链接这些依赖库
-ansi 、 -pedantic
·-pedantic
·:选项能够帮助程序员发现一些不符合ANSI/ISO C
标准的代码,-ansi:
关闭GUN C
编译,使用ANSI
,比如禁用禁止一些 asm inline typeof 关键字。
-v
打印gcc、g++
详细配置信息以及版本
--version
打印gcc、g++
版本
make工具讲解
makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系
步骤:
1、./configure --prefix=“路径”
,配制安装目录
2、make
工具能够识别并解释makefile
文件,因此只需编写好各个源文件的makefile
,使用make
指令进行生成可执行文件
3、make install
安装
cmake工具讲解
cmake
是跨平台的安装编译工具,只需要编写CMakeList.txt
文件,能够自动生成工程文件和makefile
文件,make
编译工具的高阶。
1、cmake .
指令构建工程makefile文件cmake -DCMAKE_INSTALL_PREFIX=/usr/local
2、通过make -j4
指定线程编译生成可执行文件
3、make install
安装到系统中
CMakeList.txt
文件介绍
cmake_minimum_required(VERSION 3.0.0) 指定cmake工具的最小要求版本
project(工程名 VERSION 0.0.1) 设置工程名及版本号
include(cmake/common.camke)包含编译执行文件
include_directories(include) 包含编译查找目录
execute_process(COMMAND date COMMAND echo) 执行shell脚本,可一条可多条
add_definitions(-D宏) 定义宏
add_compile_options(-std++14)添加编译选项
add_link_options(-Wl,-rpath)添加链接选项
messege(" ") 打印工程构建提示信息
add_library 编译库
set (变量名 value) 定义变量并设置初值,如果变量存在,作用赋值。
unset用于取消变量的定义
option(变量名 变量描述 ON/OFF) if(变量名) 。。。 endif(变量名)
find_package(库名 REQUIRED COMPONENTS system filesystem)确定库是否能被找到,如果可以添加一些宏定义库头文件路径和库路径,给予include_directories和target_link_libraries()使用
target_link_libraries(生成文件名 PROPERTIES 属性) 链接外部库
LINK_DIRECTORIES()增加链接目录
set_target_properties(生成文件名 库)为生成文件增加属性
add_executable(生成文件名 用到的cpp文件) 编译可执行文件
file(GLOB ALL_PROTOS proto/*.proto) 文件操作指令,GLOB将指定的一组文件打包给指定变量,还有WRITE、RAED、STRINGS等。
add_custom_target(执行名(比如clean))自定义make执行步骤,比如make clean
add_custom_command(TARGETS 执行名)必须跟在add_custom_target后