IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> Linux系统g++编译器cmakevscode -> 正文阅读

[开发工具]Linux系统g++编译器cmakevscode


学习目标:

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:

  • -p:递归创建

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

学习产出:

  • 笔记 1 篇
  • 相关代码
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:51:32  更:2022-05-18 17:51:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:35:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计