编译过程

1.编译过程:

1.1.预处理

g++ -E test.cpp -o test.i

1.2.编译生成汇编语言

g++ -S test.i -o test.s

1.3.生成机器代码

g++ -c test.s -o test.o
查看.o文件装的定义:nm -C test.o
装在.o文件的函数钱前面有数字,没有数字(没有装在.o文件)的要去外面查找。
int add(int a,int b);//声明
int add(int a,int b){
}//定义
出现错误的情况:符号为定义,符号重定义。

1.变量的定义和声明
定义:申请空间
声明:1.建立储存空间int a定义性声明,2.extern int a平时说的声明。告诉编译器变量已经在别的地方定义过了。
2.函数的声明和定义
定义:申请空间
声明:告诉编译器函数已经在别的地方定义过了
可以用有没有函数体进行区分

阶段:定义在链接阶段,声明在编译阶段

为什么声明和定义要分开:因为声明和定义作用的阶段不同,如果不分开的花,可能会发生奇怪bug。

1.4.可执行文件链接指定文件

g++ test.o -o test

运行 ./test

2.g++参数

2.1.-g 产生能够被GUN编译器GDB使用的调试信息

g++ -g test.cpp -o test

2.2.-O[n] 对代码进行优化

-O2产生尽可能小而快的代码

2.3.-l和-L 指定库文件|指定库文件路径

g++ -lmylog test.cpp
g++ -L/home/bing/mytestlib -lmytest test.cpp

2.4.-I指定头文件搜索目录

g++ -I/myinclude test.cpp

2.5.-Wall 打印警告信息

g++ -Wall test.cpp

2.6.-w关闭警告信息

g++ -w test.cpp

2.7.-std=c++11设置编译标准

g++ -sta=c++11 test.cpp

8.-o 指定输出文件名

9.-D定义一个宏

g++ -DDEBUG test,cpp -o test
定义一个DEBUG宏

3.实例

在这里插入图片描述
g++ swap.cpp -I…/include
ar rs lib.a swap.o //生成静态库
g++ main.cpp -lswap -Lsrc -Iinclude -o main //生成可执行文件

g++ swap.cpp -I…/include -fPIC -shared -o libSwap.so//生成动态库
LD_LIBRARY_PATH =src ./main //执行动态可执行文件

4.GDB调试

命令参数gdb [filename]
run®重新开始运行文件
start单步执行
list查看原代码
set设定变量的值
next(n)单步调试(逐过程,函数直接执行)
step(s)单步调试(逐语句,跳入自定义函数内部)
finish(f)结束当前函数,返回函数调用点
info(i)查看函数内部局部变量的数值
continue( c )继续执行F5
print( p )打印变量的值和地址
quit(q)推出gdb
break+num(b)在num行设置断点
info breakpoint查看当前所有的断点
delete breakpoints num(d) 删除在num行的断点
display追踪查看具体变量的值
undisplay取消追踪观察变量
watch被设置观察点的变量发生变化时,打印显示
i watch 显示观察点
enable breakpoints启用断点
disable breakpoints关闭断点
注意:需要在生成文件时加入-g才能gdb调试,g++ -g main.cpp -o main
回车键:重复上一命令
使用步骤:
gdb a
gdb命令

5.VScode

ctl+shitf+p 打开控制面板
clt+w 关闭当前页
clt+up/down当前行上下移动
clt+` 控制行
F2 变量名统一改写
clt+b 关闭侧边栏
F12转到定义处
clt+shift+f代码格式化
clt+enter在当前行下面插入一行
clt+end移到行尾
clt+home移到行首
clt+H替换
其他快件建
https://www.cnblogs.com/ljhdo/p/13373208.html

6.cmake

格式:指令(参数1 参数2),空格或者分号分开
指令不区分大小写,参数区分大小写
变量使用${},在if语句中直接使用变量名

6.1 重要指令

1.cmake_minimum_required-指定CMake的最小版本要求
cmake_minimum_required(VERSION versionNumber [FATAL_REEOR])
#cmake的最小版本是2.8.3
cmake_minimum_required(VERSION 2.8.3)
2.project-定义工程名称
project(projectname,[cxx] [c] [java])
#指定工程名字为HELLOWORLD
project(HELLOWORLD)
3.set显式的定义变量
set(VAR [VALUE1][CACHE TYPE DOCSTRING] [FORCE])
#定义SRC变量,其值为main,cpp hello.cpp
set(SRC main.cpp hello.cpp)
4.include_directories-向工程添加多个特定的头文件搜索路径,相当于g++的-I指定路径参数
include_directories([AFTER] [BEFORE] [SYSTEM] dir1 dir2)
#/user/include/myincludefolder ./include添加到头文件搜索路径
include_directories(/user/include/myincludefolder ./include)
5.link_directories-向工程文件添加多个指定的库文件搜索路径,相当于g++的-L指定路径参数
#将/user/lib/mylibfolder ./lib添加到库文件搜索路径
link_directories(/user/lib/mylibfolder ./lib)
6.add_library-生成库文件
add_library(libname [SHARED] [STATIC] soures1 soures2)
#通过SRC变量,生成libhello.o共享库文件
add_library(hello SHARED ${SRC})
7.add_compile_options-添加编译参数
add_compile_options()
#添加编译参数-Wall -std=c++11 -o2(优化代码)
add_compile_options(-Wall -std=c++11 -o2)
8.add_excutable-生成可知性文件
add_extuable(exename source1 source2)
#编译main.cpp为main可知性文件
add_extutable(main main.cpp)
9.target_link_libraries-target添加所需要链接的共享库-相当于指定g++的-l参数
treget(target library1<debug | optimized>…)
#将hello动态库链接到main
target_link_libraries(main hello)
10.add_subdirectory-向当前文件添加存放源文件的子目录,并可以指定中间二进制和目标二进制文件存放的位置
add_subdirectory(source_dir [binary_dir] [EXCLUDE-FROM_ALL])
#添加src子目录,src中需要有一个CMakeLists.txt文件
add_subdirectory(src)
11.aux_source_director-发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
aux_source_directory(dir VARIABLE)
#定义SRC变量,其值为当前目录所有的源文件代码
aux_source_directory(. SRC)
#编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})

6.2重要变量

1.CMAKE_C_FLAGS gcc编译选项
CMAKE_CXX_FLAGS g++编译选项
#在CMAKE_CXX_FLAGS 编译选项后面追加-std=C++11
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=C++11”)
2.CMAKE_BUILD_TYPE 编译类型(Debug,Release)
#设置编译类型为Debug
set(CMAKE_BUILD_TYPE Debug)
#设置编译类型为Release
set(CMAKE_BUILD_TYPE Release)
3.EXECUTABLE_OUTPUT_PATH 可执行文件输出存放路径
LIBRARY_OUTPUT_PATH 库文件输出存放路径
4.CMAKE_SOURCE_DIR 当前文件的路径
5.追加C++选项:set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -g -O2 -Wall” )

6.3CMake编译工程

CMake目录结构:项目主目录存在一个CMakeList.txt文件
两种方式设置编译规则
1.包含源文件的子文件包含CMakeList.txt文件,主目录的CMakeList.txt通过add_subdirectory添加子目录即可
2.包含源文件的子文件不包含CMakeList.txt文件,子目录的编译规则体现在主目录下的CMakeList.txt文件中

6.3.1在linux下使用CMake构建C/C++工程

1.手动编写CMakeList.txt
2.执行命令cmake PATH生成Makefile,PAHT是CMakeList.txt所在的目录
3.执行命令make进行编译
.
./表示当前路径


…/表示上级目录

6.3.2两种构建方式

1.内部构建:都放一个文件中
cmake .
make
2.外部构建:分开放
mkdir build
cd build
cmake …(在哪里执行cmake,文件就放在哪里)
make

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值