当前位置: 首页 > 工具软件 > Vala_CMake > 使用案例 >

g++,Makefile,CMake

施选
2023-12-01

一、g++
1.g++简介
g++是GNU编译套件里面的c++编译器

2. g++编译器编译阶段

g++编译工作分为4个阶段:

预编译
    g++ -E test.cc -o test.ii
编译
    g++ -S test.ii -o test.s
汇编
    g++ -c test.s -o test.o
链接
    g++ test.o -o test.out

3.命令格式
g++ [-c|-S|-E] [-std=standard]
    [-g] [-pg] [-Olevel]
    [-Wwarn...] [-pedantic]
    [-Idir...] [-Ldir...]
    [-Dmacro[=defn]...] [-Umacro]
    [-foption...] [-mmachine-option...]
    [-o outfile] [@file] infile...


4.命令选项

4.1 总体选项

-E
    预编译选项
    该选项会让编译过程只进行到预编译过程,需要注意的是,该选项不会自动生成输出文件,需要自己使用重定向到指定文件或者-o选项指定到文件,例:
    g++ -E test.cc -o test.ii
    g++ -E test.cc > test.ii
-S
    编译选项
    该选项会让编译过程只进行到编译过程,并且生成.s的文件,例:
    g++ -S test.cc
    将生成test.s的汇编代码
-c
    汇编选项
    该选项会让编译过程只进行到汇编过程,并且生成.o的文件,例:
    g++ -c test.cc
    将会生成test.o的目标文件
-o
    指定生成目标文件名,如在链接阶段不指定,则链接完成后生成默认可执行文件名为a.out,例:
    g++ test.cc
    生成a.out的可执行文件
    g++ test.cc -o test.out
    生成test.out的可执行文件

4.2 语言选项

-std=standard
    用以指定语言的标准,如不指定,则默认为c++98标准,例:
    g++ -std=c++11 test.cc -o test.out
    将会以c++11的语言标准对test.cc进行编译

4.3 调试选项

-g
    以操作系统的本机格式生成调试信息。GDB可以使用此调试信息。
    在大多数使用stabs格式的系统上,-g支持使用只有GDB才能使用的额外调试信息;这些额外的信息使调试在GDB中工作得更好,但可能会使其他调试器崩溃或拒绝读取程序。

-glevel
    请求调试信息,并使用级别指定信息量。默认级别为2。
    级别0根本不生成调试信息。因此,-g0不等于-g。
    级别1产生的信息最少,足以在程序中不打算调试的部分进行回溯。这包括函数和外部变量的描述,以及行号表,但没有关于局部变量的信息变量。
    级别3包括额外信息,如程序中存在的所有宏定义。使用-g3时,某些调试器支持宏扩展。
    如果您使用多个-g选项,有或没有级别号,最后一个选项是有效的。

-ggdb
    生成调试信息供gdb使用。

4.4 目录选项
这些选项指定用于搜索头文件、库和编译器部分的目录:
对于文件中的include指令的引号形式,首先搜索当前文件的目录。

-I dir
    用该选项指定的目录会按从左到右的顺序扫描
-I- 
    用于取消前一个参数的功能

-llibrary
    用于编译时使用的库,例如现有libtest.a的库在系统库目录,用法:
    g++ test.cc -ltest -o test.out
-L dir
    用于搜索库的目录,例如上文的libtest.a的库放在/home/lib/目录下,则用法为:
    g++ test.cc -L/home/lib/ -ltest -o test.out

4.5 优化选项
使用该选项,编译器会尝试减少代码大小和执行时间,而不会执行任何耗费大量编译时间的优化,共有4个级别。

-Olevel

-O0 减少编译时间并使调试产生预期结果。这是默认设置。
-O1
-O2
-O3 优化级别最高

4.6 链接选项

-static
    在支持动态链接的系统上,会覆盖-pie选项并阻止与共享库的链接。其他系统上,无效。
-shared
    生成一个共享对象,然后该对象可以与其他对象链接以形成一个可执行文件。并非所有系统都支持此选项。为了获得可预测的结果,在指定此链接器选项时,还必须指定用于编译的同一组选项(-fpic、-fpic或模型子选项)。
-Wl,-Bstatic
    告诉链接器ld只链接静态库,如果只存在动态链接库,则链接器报错。
-Wl,-Bdynamic
    告诉链接器ld优先使用动态链接库,如果只存在静态链接库,则使用静态链接库。

4.7 高警选项
-pedantic
    允许发出ANSI/ISO C标准所列出的所有警告
-pedantic-errors
    允许发出ANSI/ISO C标准所列出的错误
-Wall
    一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告
-Wno-deprecated
    使用C++标准废弃特性不告警
-Werror
    要求GCC将所有的警告当成错误进行处理,在警告发生时中止编译过程。
-Werror={warning}
    将指定警告设置为错误。例如-Werror=return-type,如果函数需要返回值却没有return语句,则编译报错
-w
    关闭所有警告,建议不要使用此项。

4.8 预处理选项
-Dmacro
    相当于C语言中的#define macro 
-Dmacro=defn
    定义宏,相当于C语言中的#define macro defn 
-Umacro
    取消宏定义,相当于C语言中的#undef macro 
-undef
    取消任何非标准宏的定义,C++标准预定义的宏仍然有效

4.9 其他常用选项

-fPIC
    同-fpic功能一致,生成位置无关目标码,用于生成动态链接库,建议使用该选项,而非-fpic

二、Makefile
1.Makefile基本规则
目标: 依赖
    命令

一个规则中除了目标,其他两个部分并不是都是必须存在的。
一个Makefile可以包含多个规则。

2. 变量的使用
变量的定义:
VAL=main.cc
VAL:=main.cc    该方法定义的变量的值只会是第一次定义的值
VAL?=main.cc    该方法会判断当前变量之前是否被赋值,如果被赋值,则使用之前的值,如果没有,把当前值赋给变量
VAL+=main.cc    该方法会给前面已经定义好的变量添加一些字符串进去

变量的使用:
$(VAL)    使用VAL变量
${VAL}    使用VAL变量

其他:
%    类同:通配符,例如%.cc,表示所有以.cc结尾的文件
\    行分隔符

3. 自动变量
$@    目标
$^    所有依赖,以空格隔开
$<    依赖列表的第一个依赖
$?    依赖列表中被修改的文件

4.常用函数
patsubst函数

$(patsubst <pattern>,<replacement>,<text>)

例如:
$(patsubst %.c,%.o,a.c b.c c.c)
#将字符串“ a.c b.c c.c”中的所有符合“ %.c”的字符串,替换为“ %.o”,替换完成以后的字符串为“ a.o b.o c.o”

三、CMake
1.设置cmake版本
cmake_minimum_required(VERSION 3.10)
2.设置项目名和版本
project(Test VERSION 1.0.0)
3.打印消息
message()
4.引用的头文件目录
include_directories(${PROCECT_SOURCE_DIR}/include/})
5.引用的库文件目录
link_directories(${PROCECT_SOURCE_DIR}/lib/)
6.指定链接的库
target_link_library(Test pthread)
7.生成可执行文件
add_executable(Test ${PROCECT_SOURCE_DIR}/src/test.cc)
8.增加全局宏定义
add_definitions(-D_DEBUG)    #定义_DEBUG宏

9.生成库文件
add_library(mylib STATIC ${PROCECT_SOURCE_DIR}/lib/src/lib.cc)    # 生成静态库
add_library(mylib SHARED ${PROCECT_SOURCE_DIR}/lib/src/lib.cc)    # 生成动态库

10.一些set指令
set(cmake_build_type DEBUG)    # 指定编译类型 DEBUG/RELEASE
set(CMAKE_CXX_STANDARD 14)    # 指定c++语言编译标准为c++14
set(CMAKE_CXX_STANDARD_REQUIRED ON)    # 设置指定的C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")    #对于Debug版本,开启调试信息,不进行代码优化
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")    #对于Release版本,不包含调试信息,优化等级设置为2

 类似资料: