cmake、makefile、gcc、g++工程编译讲解

编译的过程

cmake、makefile、gcc、g++工程编译讲解_第1张图片

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后

你可能感兴趣的:(编译工具,gnu,c++,visual,studio)