学习目标:
linux系统目录结构 linux指令 编译器 调试器
学习内容:
linux目录结构
bin :存放二进制文件,文件可以被执行 dev :存放外接设备,例如盘、光盘等。外接设备是不能直接使用的,需要挂载。(类似windows分配盘符) etc :存放一些配置文件 home :表示家,表示除了root用户以外其他用户的家目录,类似与windows user/用户目录 proc :process,表示进程,该目录中存储的是Linux运行时候的进程 root :是root自己的家目录,相当于windows管理员administrator sbin :super binary,可执行的二进制文件,但是必须有super权限的用户才能执行 tmp :临时文件,系统运行时候产生的临时文件 usr :存放的是用户自己安装的软件,类似于windows program files var :存放的程序/系统的日志文件 mnt :当外界设备需要挂在的时候,就挂载在这
常用指令
格式:命令(空) [选项](空)[操作对象](选项和操作对象可以多个) 例: ls -a -l -h /home ../ ls -alh /home ../ pwd :打印当前目录 ls :
-l :表示list,表示以详细列表的形式进行展示-a :表示显示所有文件文件夹,包括隐藏的-h :表示以可读性较高的形式显示- 权限中: drwxrwxrwx,-rwxrwxrwx
- d表示目录,-代表文件夹,后面顺序是所有者,所在组,其他人权限
cd : cd ~ 和cd 等价 mkdir :
touch :创建新文件 rm :删除 man :查看指令帮助 reboot :重启 shutdown :关机
安装软件
每次安装软件前,先运行sudo apt update
编译器
gcc,g++编译器
- gcc支持编译Go,Objective-C,Objective-C++,Fortran,Ada, D和BRIG等程序
- VSCode 是通过调用GCC编译器来实现C/C++编译工作的
- 实际使用中,gcc-编译c,g++编译c++
编译过程
1、预处理 //.i文件 g++ -E test.cpp -o test.i 2、编译 // .s文件 g++ -S test.i -o test.s 3、汇编 //.o文件 g++ -c test.c -o test.o 4、链接 // bin文件 g++ test.o -o test 一条命令,可以包括上面4个步骤 g++ test.cpp -o test ,生成的文件是绿色,绿色文件表示可执行文件。
g++重要参数
-
-g :编译输出带调试信息的可执行文件,产生能被GNU调试器GDB是使用的调试信息,用来调试程序。 -
-O[n]:优化代码。 g++ -O2 test.cpp -
-l :指定程序要链接的苦,紧接着库名没有空格,在/lib 和/usr/lib 和 /usr/local/lib里的库。 g++ -lglog test.cpp -
-L:没有放在上面三个目录里的裤,链接mytest库,libmytest.so 在/home/zhou/mylib 目录下 g++ -L/home/zhou/mylib -lmylib test.cpp -
-I:指定头文件的搜索目录。如果头文件在/usr/include里,不需要指定,如果不在需要指定。 g++ -I/myinclude test.cpp -
-Wall:打印警告信息. g++ -Wall test.cpp -
-w:关闭警告信息 g++ -w test.cpp -
-std=c++11:设置编译标准 g++ -std=c++11 test.cpp -
-o:指定输出文件,不加会输出a.out -
-D:定义宏. -Dname ,name为一个字符,默认为1。 g++ -DDEBUG test.cpp
#include <stdio.h>
int main()
{
#ifdef DEBUG
printf("debug log\n");
#endif
printf("in\n");
return 0;
}
链接静态库生成可执行文件
# 进入src目录
cd src
# 汇编,生成swap.o文件
g++ swap.cpp -c -I../include
# 生成静态库libswap.a,ar rs 是打包命令
ar rs libswap.a swap.o
# 返回上一级目录
cd ..
# 链接,生成可执行文件
g++ main.cpp -Iinclude -Lsrc -lswap -o staticmain
链接动态库生成可执行文件
# 进入src目录
cd src
# 生成动态库, -fPIC表示与路径无关,-shared 代表生成动态库文件
g++ swap.cpp -I../include -fPIC -shared -o libswap.so
# 上面一个等于下面两个
# g++ swap.cpp -I../include -c fPIC
# g++ -shared -o libswap.so swap.o
# 生成静态库libswap.a,ar rs 是打包命令
ar rs libswap.a swap.o
# 返回上一级目录
cd ..
# 链接,生成可执行文件
g++ main.cpp -Iinclude -Lsrc -lswap -o dynamic_main
分析:静态库比动态库大,但是动态库需要如下操作: LD_LIBRARY_PATH=src ./dynamic_main
GDB调试器
GDB是用来调试c/c++程序。
常用命令参数
gdb [exefilename] 进入gdb调试程序 。。。
注意:编译的时候要加 -g
CMake
CMake 是一个跨平台的安装编译工具,是大部分c++开源项目的标配。
基本语法
格式:指令(参数1 参数2 …),参数之间用空格或逗号分开。 指令大小写无关,参数和变量大小写有关。 变量使用${}方式取值,但是IF语句中直接使用变量名
重要指令
[]表示可选项
- cmake_minimum_required:指定CMake最小版本要求
例: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR]) cmake_minimum_required(VERSION 2.8.3) - project:定义工程名字,并可以指定工程支持的语言
例: project(projectname [CXX][C][Java]) project(HELLOWORLD) - set:显示的定义变量
例: set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) set(SRC sayhello.cpp hello.cpp) # 定义SRC变量,其值为sayhello.cpp,hello.cpp - include_directories:向工程增加多个特定的头文件搜索路径(相当于g++编译器的-I参数)
例: include_directories([AFTER | BERFORE] [SYSTEM] dir1 dir2 ...) include_directories(/usr/lib/myincludefolder ./include) # 将/usr/lib/myincludefolder ./include 增加到头文件搜索路径 - link_directories:向工程增加多个特定的库文件搜索路径(相当于g++编译器的-L参数)
例: link_directories(dir1 dir2 ...) link_directories(/usr/lib/mylibfolder ./lib) # 将/usr/lib/mylibfolder ./lib 增加到库文件搜索 - add_library: 生成库文件
例: add_library(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ...) # shared 代表动态库,static代表静态库,module(需要查一下) add_library(hello SHARED ${SRC}) # 通过变量SRC生成libhello.so 共享库 - add_compile_options:增加编译参数
例: add_compile_options(<option>...) add_compile_options(-Wall -std=c++11 -O2) - add_executable:生成可执行文件
例: add_executable(exename source1 source2 ...) add_executable(main main.cpp) # 编译main.cpp 生成main - target_link_libraries:为target增加需要链接的共享库(相当于g++编译器-I参数)
例: target_link_libraries(target library1<debug | optimized> library2...) target_link_libraries(main hello) # 将hello动态库文件链接到可执行文件main - add_subdirectory:向当前工程增加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
例: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) add_subdirectory(src) # 添加src子目录,src里需要有一个CMakeList.txt - aux_source_directory:发现一个目录下所有的源代码文件并将其存储在一个变量中,这个指令临时备用来自动构建源文件列表
例: aux_source_directory(. SRC) # 定义SRC变量,其值为当前目录下所有源代码文件 add_executable(main ${SRC}) # 编译SRC变量所代表的源代码文件,生成main可执行文件
常用变量
- CMAKE_C_FLAGS:gcc编译选项
- CMAKE_CXX_FLAGS:g++编译选项
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11 - CMAKE_BUILD_TYPE:编译类型(Debug Release)
set(CMAKE_BUILD_TYPE Debug) set(CMAKE_BUILD_TYPE Release) - CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR:三者内容一样
- CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR:三者内容一样,当前工程的路径
- CMAKE_C_COMPILER:指定C编译器
- CMAKE_CXX_COMPILER:指定C++编译器
- EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
- LIBRARY_OUTPUT_PATH:库文件输出的存放路径
CMake编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件CMakeLists.txt 两种方式设置编译规则: 1、包含源文件的子文件夹包含CMakeList.txt文件,主目录的CMakeLists.txt通过add_subdirectory增加子目录即可。 2、包含源文件的子文件夹未包含CMakeList.txt文件,子目录编译规则体现在主目录的CMakeList.txt中。
编译流程
- 手动编写CMakeList.txt
- 执行cmake PATH 生成Makefile(PATH 是顶层CMakeLists.txt所在的目录)
- 执行make进行编译
构建
- 内部构建(in source build):不推荐使用
- 外部构建(out-of-source build):推荐
mkdir build
cd build
cmake ..
make
学习时间:
- 2022.5.12:09.00-12.00
- 2022.5.13:18.30-21.30
- 2022.5.14:13.30-16.00
学习产出:
|