linux系统下如何学习开源代码?
gdb如何调试源代码
此博客为哔哩哔哩课程视频笔记:基于VSCode和CMake实现C/C++开发 | Linux篇
1.gcc编译器
如果是c语言,使用gcc编译器
如果是c++语言,使用g++编译器
1.1.g++编译过程
g++ -E test.cpp -o test.i
g++ -S test.i -o test.s
g++ -c test.s -o test.
g++ test.o -o test1
预处理
编译
汇编
链接
1.2.g++重要编译参数
-g
g++ -g
产生包含可调式信息的可执行文件
-o2
g++ -o2
优化源代码
一般选择o2就够用了,默认为o1
time ./test
通过time命令执行test可执行文件。
-l和-L 指定库文件和库文件路径
/lib
/usr/lib
/usr/local/lib
里面的库直接使用-l参数就能链接
g++ -lglog test.cpp
链接glog库
如果库文件没有在上面三个目录里面,需要使用-L参数(大写)指定库文件所在目录。
g++ -L/home/rdm/test -lmytest test.cpp
链接/home/rdm/test路径下的mytest库
-I 指定头文件搜索目录
默认头文件所在目录:/usr/include
-I是include的缩写。
如果
-Wall 打印警告信息
-w 关闭警告信息
-std=c++11设置编译标准
-o 指定输出的文件名
不加 -o,默认输出a.out可执行文件
-D 定义宏
编译的时候定义宏
man指令
查看执行的英文手册
man gcc
1.3.实战:g++命令行编译
tree .
打印当前文件夹下代码的目录结构
dmran@** ~/rdm/code 21:43 $ tree ./
./
├── include
│ └── swap.h
├── main
├── main.cpp
└── swap
└── swap.cpp
1.3.1直接编译
编译命令
g++ main.cpp swap/swap.cpp -Iinclude -o main
1.3.2 链接静态库生成可执行文件
1).汇编,生成swap.o文件
dmran@** ~/rdm/code/swap 21:51 $ g++ -c swap.cpp -I../include
dmran@** ~/rdm/code/swap 21:52 $ ls
swap.cpp swap.o
2).生成静态库libswap.a
dmran@** ~/rdm/code/swap 21:52 $ ar rs libswap.a swap.o
ar: creating libswap.a
dmran@** ~/rdm/code/swap 21:53 $ ls
libswap.a swap.cpp swap.o
3).链接生成可执行文件:static_mian
dmran@** ~/rdm/code 21:55 $ g++ main.cpp -lswap -Lsrc -Iinclude -o static_main
dmran@** ~/rdm/code 21:56 $ ls
include main main.cpp src static_main
1.3.3 链接动态库生成可执行文件
-shared
表示生成动态库
1).生成动态库
rdm@** ~/rdm/code/src 22:06 $ g++ swap.cpp -I../include -fPIC -shared -o swap.so
rdm@** ~/rdm/code/src 22:06 $ ls
libswap.a swap.cpp swap.so
上面的命令相当于下面两条命令:
rdm@** ~/rdm/code/src 22:09 $ g++ swap.cpp -I../include -fPIC -c
rdm@** ~/rdm/code/src 22:09 $ ls
libswap.a swap.cpp swap.o
rdm@** ~/rdm/code/src 22:10 $ g++ -shared -o libSwap.so swap.o
rdm@** ~/rdm/code/src 22:10 $ ls
libswap.a libSwap.so swap.cpp swap.o
2).链接,生成可执行文件
g++ main.cpp -lswap -Lsrc -Iinclude -o dyna_main
LD_LIBERARY_PATH指定动态库的查找路径
2.gdb调试器
2.1 gdb常用命令参数
2.2 实战
再gdb调试环境下,按一下【ctrl+l】清屏。
shh远程终端如何分屏
3.IDE-VSCode
4.CMake
跨平台的的安装编译工具
CMakeList可以通过camke命令生成不同平台下的构建文件。
visual sudio >msbuild
xcode>xcodebuild
makefile==make
如果一个项目增加了一个文件,只需要修改cmakelist文件,而不用改变不同平台的构建文件。
如果灭有cmake工具,那么每个平台的构建文件都需要修改一遍。
语法特性
基本语法格式:
指令(参数1 参数2…)
参数之间使用空格或分号隔开。
变量使用${}取值
重要指令
cmake_minimumu_required指定cmake的最小版本要求
project定义工程名称,并可指定工程可支持的语言
set显示的定义变量
set(var [value][])
# 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
include_directories-向工程添加多个特定头文件搜索路径
link_directories-向工程添加多个特定的库文件搜索路径
add_library-生成库文件
add_library(libname [shared|static|module\
# 通过SRC生成hello.so共享库
add_library(hello SHARED ${SRC})
add_compile_options-添加编译参数
add_compile_options(-wall -std=c++11 -o2)
add_executable-生成可执行文件
add_executable()
aux_source_directory
aux_source_directory(. SRC)
CMake常用变量
CMAKE_C_FLAGS gcc编译选项
CMAKE_Cxx_FLAGS g++编译选项
CMAKE_BUILD_TYPE
CMake编译工程
cmake目录结构:项目主目录存在一个CMakeList文件
两种编译规则:
1.
2.
编译流程
手写CmakeLists.txt
执行cmake Path生成makefile(PATH是顶层CMakeLists.txt所在目录)
执行make进行编译