Linux--学习记录(3)

  • G++重要编译参数

    • -g(GDB调试)
      • -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息,以调试程序
      • 编译带调试信息的可执行文件
      • g++ -g hello.c -o hello
    • 编译过程:
      • -E(预处理)
        • g++ -E hello.c -o hello.i
      • -S(编译)
        • g++ -S hello.i -o hello.s
      • -c(汇编)
        • g++ -c hello.s -o hello.o
      • 链接
        • g++ hello.o -o hello
    • -O[n]
      • 优化源代码
      • -O0:表示不做优化
      • -O1:为默认优化
      • -O2:除了完成-O1的优化之外,还进行一些额外的优化工作,如指令调整等(一般使用这个即可满足要求)
      • g++ -O2 hello.c -o hello
    • time
      • time ./hello 
        • 可以带引该可执行文件的执行时间
    • -l(指定库文件、-L(指定库文件路径)
      • 在/lib、/usr/lib及/usr/local/lib里的库直接-l参数就能链接
        • 例:链接glog库
          • g++ -lglog hello.c -o hello
      • 如果库文件没放在以上三个目录里,需要使用-L参数指定库文件所在目录
          • g++ -L/home/wangxianyue/hellolibfolder -lhello hello.c -o hello
    • -I(指定头文件搜索目录)
      • /usr/include一般是不用指定的,gcc知道去;但如果头文件不在这里,就需要使用-I参数进行指定了。
        • 例:头文件放在当前目录中
          • g++ -ImyInclude hello.c -o hello
    • -Wall(打印警告信息)
      • g++ -Wall hello.c -o hello
    • -w(关闭打印信息)
      • g++ -w hello.c -o hello
    • -std=c++11(设置编译标准)
      • g++ -std=c++11 hello.cpp -o hello
    • -o(指定输出文件名)
      • g++ hello.c -o  hello
    • -D(定义宏)
      • g++ -DDEBUG hello.c -o hello
  • g++命令行编译(命令实战)

    • -I命令(直接编译)
    • 生成库文件并编译
      • 1. 生成静态库(编译时链接)
        • 步骤1:先进入src目录下
        • 步骤2:先生成.o的汇编文件
        • 步骤3:生成静态库libSwap.a
        • 步骤4:回到上级目录
        • 步骤5:链接,生成可执行文件static_main(-l会自动省略lib及.a,故直接输入-lSwap即可)
        • 步骤6:运行static_main即可(./static_main)
      • 生成动态库(运行时链接)
        • 步骤1:进入src目录下
        • 步骤2:生成动态库libSwap.so
        • 步骤3:回到上级目录
        • 步骤4:链接,生成可执行文件dynamic_main
        • 步骤5:运行
      • 常用调试命令参数

        • GDB调试器:
          • 用来调试C/C++程序的功能强大的调试器,是linxu系统开发C/C++最常用的调试工具
          • 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量
          • linxu开发C/C++一定要熟悉GDB
          • VScode是通过调用GDB调试器来实现C/C++的调试工作的
          • Windows系统中,常用的集成开发环境(IDE),如VS,VC等,他们内部已经嵌套了相应的调试器
        • GDB主要功能:
          • 设置断点(断点可以使条件表达式)
          • 使程序在指定的代码上暂停执行,便于观察
          • 单步执行程序,便于调试
          • 查看程序中变量值的变化
          • 动态改变程序的执行环境
          • 分析崩溃程序产生的core文件
        • 常用调试命令参数
          • 调试开始:执行gdb exefilename,进入gdb调试工具,其中exefilename为要调试的可执行文件名
          • 参数
            • help(h):查看命令帮助,具体命令查询在gdb中输入help + 命令
            • run(r):重新开始运行文件
            • start:单步执行,运行程序,停在第一行执行语句
            • list(l):查看源代码,(list n:从第n行开始查看代码;list 函数名:查看具体函数)
            • set:设置变量的值
            • next(n):单步调试(逐过程,函数直接执行)
            • step(s):单步调试(逐语句,跳入自定义函数内部执行)
            • backtrace(bt):查看函数的调用的栈帧和层级关系
            • frame(f):切换函数的栈帧
            • info(i):查看函数内部局部变量的数值
            • finish:结束当前函数,返回到函数调用点
            • continue(c):继续执行(跳到下一个断点)
            • print(p):打印值及地址
            • quit(q):退出调试
            • break+num(b):在第num行设置断点
            • info breakpoints:查看当前设置的所有断点
            • delete breakpoints num(d):删除第num个断点
            • display:追踪查看具体变量值
            • undisplay:取消追踪观察变量
            • watch:被设置观察点的变量发生修改时,打印显示
            • i watch:显示观察点
            • enable breakpoints:启用断点
            • disable breakpoints:禁用断点
            • x:查看内存
            • run argv[1]  argv[2]:调试时命令行传参
            • set follow-fork-mode child:#Makefile项目管理,选择跟踪父子进程(fork())
          • Tips:
            • 编译程序时,需要加上-g参数,之后才能进行gdb调试,gcc -g hello.c -o hello
            • 回车键,重复上一命令
      • VSCode使用

        • 高频使用快捷键
        • 代码格式化
          • ctrl+shift+i
        • 左右缩进
          • ctrl+[     ctrl+]
        • 搜索
          • ctrl+f
        • 搜索加替换
          • ctrl+h
        • 全局搜索
          • ctrl+shift+f
        • 全屏
          • F11
        • 放大/缩小
          • ctrl +/-
    • 实战技巧
      • 分屏
        • 右键->向右拆分
      • 固定打开的文件
        • 双击打开文件为固定,单击打开文件,再打开其他文件时会被覆盖
  • CMake

    • Cmake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)
    • CMake已经成为大部分C++开源项目标配
    • 语法特性
      • 基本语法格式:
        • 指令(参数1  参数2)
          • 参数使用括号括起来
          • 参数之间使用空格或分号隔开
        • 指令是大小写无关的,参数和变量是大小写相关的
          • 例如:
            • set(HELLO hello.cpp)
            • add_executable(hello hello.cpp main.cpp)
            • ADD_EXECUTABLE(hello hello.cpp ${HELLO})
        • 变量使用${}方式取值,但是在IF控制语句中直接使用变量名
      • 重要指令和CMake常用变量
        • 重要指令
          • cmake_mininum_required---指定CMake的最小版本要求
            • 语法:
              • cmake_mininum_required(VERSION versionNumber [FATAL_ERROR])
              • 例如:(CMake最小版本要求为2.8.3)
                • cmake_mininum_required(VERSION 2.8.3)
          • project---定义工程名称,并可指定工程支持的语言
            • 语法:
              • project(projectName [CXX] [C] [JAVA])
              • 例如:指定工程名为HELLOWORLD
                • project(HELLOWORLD)
          • set---显式的定义变量
            • 语法:
              • set(VAR [VALUE] [CACHE TYPE DOCSTRING] [FOECR]])
              • 例如:(定义src变量,其值为sayhello.cpp hello.cpp)
                • set(SRC sayhello.cpp hello.cpp)
          • include_directories---向工程添加多个特定的头文件搜索路径
            • 语法:
              • include_directories([AFTER | BEFORE] [SYSTEM] dir1 dir2 ...)
              • 例:(将/usr/include/myincludefolder和./include 添加到头文件搜索路径)
                • include_directories(/usr/include/myincludefolder ./include)
          • link_directories---向工程添加多个特定的库文件搜索路径
            • 语法:
              • link_directories(dir1 dir2 ...)
                • 例:(将/usr/lib/mylibfolder和./lib添加到库文件搜索路径)
                  • link_directories(/usr/lib/mylibfolder ./lib)
          • add_library---生成库文件
            • 语法:
              • add_library(libname [SHARD | STATIC | MODULE | EXCLUDE_FROM_ALL] source1 source2 ....)
              • 例:(通过变量SRC生成libhello.so动态库)
                • add_library(hello SHARD ${SRC})
          • add_compile_options---添加编译参数
            • 语法:
              • add_compile_options(<option> ...)
            • 例:(添加编译参数)
              • add_compile_options(-Wall -std=c++11 -o2)
          • add_excutable---生成可执行文件
            • 语法:
              • add_excutable(exename source1 source2 ... sourceN)
            • 例:(编译main.cpp生成可执行文件)
              • add_excutable(main main.cpp)
          • target_link_libraries---为target添加需要链接的共享库(也叫动态库)
            • 语法:
              • target_link_libraries(target library1<debug | optimized> library2....)
            • 例:(将hello动态库文件链接到可执行文件main)
              • target_link_libraries(main hello)
          • add_subdirectory---向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
            • 语法:
              • add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
            • 例:(添加src子目录,src中需要有一个CmakeList.txt)
              • add_subdirectory(src)
          • aux_source_directory---发现一个目录下所有的源代码文件,并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
            • 语法:
              • aux_source_directory(dir VARIABLE)
            • 例:
              • 定义SRC变量,其值为当前目录下所有的源文件代码
              • aux_source_directory(. SRC)
              • 编译SRC变量所代表的源文件代码,生成main可执行文件
              • add_excutable(main ${SRC}) ??顺序??????????
      • CMake常用变量:
        • CMAKE_C_FLAGS:gcc编译选项
        • CMAKE_CXX_FLAGS:g++编译选项
        • 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
          • set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS -std=c++11")
        • CAMKE_BUILD_TYPE:编译类型
          • 设定编译类型为debug,调试时需要选择debug
            • set(CMAKE_BUILD_TYPE Debug)
          • 设定编译类型为release,调试时需要选择release
            • set(CMAKE_BUILD_TYPE Release)
        • CAMKE_C_COMPILER:指定C编译器
        • CMAKE_CXX_COMPILER:指定C++编译器
        • EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
        • LIBRARY_OUTPUT_PATH:库文件输出的存放路径
      • CMake编译工程
        • CMake目录结构:
          • 项目主目录存在一个CMakeList.txt文件
        • 两种方式设置编译规则:
          • 包含源文件的子文件夹包含CMakeList.txt文件,主目录的CMakeList.txt通过add_sublibrary添加子目录即可
          • 包含源文件的子文件夹未包含CMakeList.txt文件,子目录编译规则体现在主目录的CMakeList.txt文件中
        • 编译流程:
          • 在linux平台下使用CMake构建C/C++工程的流程如下:
            • 手动编写CMakeList.txt文件
            • 执行命令cmake PATH生成makefile(PATH是顶层CMakeList.txt所在的目录)
            • 执行命令make进行编译
        • 两种构建方式:
          • 内部构建---不推荐使用
            • 内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是我们最终所需要的,和工程源文件放在一起会显得杂乱无章;
            • 例:
              • 在当前目录下,编译本目录的CMakeList.txt,生成makefile和其他文件
                • cmake .
              • 执行make命令,生成target
                • make
          • 外部构建---推荐使用
            • 将编译输出文件与源文件放到不同目录中
              • 在当前目录下,创建build文件夹
                • mkdir build
              • 进入到build文件夹
                • cd build
              • 编译上级目录的CMakeList.txt,生成Makefile和其他文件
                • camke ..
              • 执行make命令,生成target
                • make
  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值