gcc和gdb和g++和makefile,CMake

gcc

在这里插入图片描述

  • 直接输出结果
    • gcc -Wall hello.c hello
  • 系统缺省的头文件目录
    • \usr\local\include\
    • /usr/include/
  • 系统缺省的库文件目录
    • /usr/local/lib/
    • /usr/lib/

gcc中的参数

在这里插入图片描述

-M

-M

  • gcc中的-M选项用于生成Makefile的依赖关系列表。这个选项告诉编译器生成一个包含源文件及其依赖的头文件的列表,而不是编译源文件。这对于自动化构建过程非常有用,特别是在大型项目中,确保在修改了某个头文件后,所有依赖它的源文件都能被重新编译。

  • 找到依赖项的位置

-v

  • -v Verbose冗长选项
  • 在 gcc 编译器中,-v 参数用于显示详细的编译过程信息,包括编译器的版本信息、使用的标准库路径、头文件搜索路径等。这有助于调试编译问题,了解编译器的工作原理,以及诊断编译过程中可能出现的问题。

-c

编译:产生目标文件

  • 加入-c
    • gcc -Wall -c main.c
      • 后面可以不加入-o,gcc回自动生成main.o

-l

  • 链接外部库

  • gcc -Wall main.c /usr/lib/libm.a -o calc可以简写为gcc -Wall main.c -lm -o calc

  • 在这里插入图片描述
    在这里插入图片描述

  • 静态库

    • .lib
    • .a

-L

  • -L链接库文件的目录
  • 在这里插入图片描述

-std

  • gcc -Wall test.c -o test 使用gnu编译
  • gcc -Wall -ansi test.c -o test 使用标准c标准编译
  • gcc -Wall -ansi -pedantic test.c 严格按照C标准
    • 可边长数组是GCC的标准不是标准c的标准
    • 在这里插入图片描述
  • gcc -Wall -ansi -D_GNU_SOURCE test.c -o test
    • 仍然使用标准C编译,但是使用GNU的库

-Wall选项

在这里插入图片描述

-Wcomment检测注释是否嵌套
在这里插入图片描述
在这里插入图片描述

库文件的查找顺序

在这里插入图片描述

编译过程

在这里插入图片描述

  • 预处理

    • 在这里插入图片描述
  • 编译

    • 在这里插入图片描述
  • 汇编

    • 在这里插入图片描述
  • 链接

    • 在这里插入图片描述

预处理

在这里插入图片描述

  • 命令行中可以通过-D定义宏
    在这里插入图片描述
    • 查看gcc原先就已经定义的宏
      • cpp -dM /dev/null
    • -E不想编译,只想看预处理之后的结果
      • gcc -E test.c
    • gcc -Wall -c -save-temps hello保存所有的中间结果
      在这里插入图片描述

创建库

在这里插入图片描述

  • ar cr

    • -c只编译不链接
    • gcc -Wall -c func1.c
    • gcc -Wall -c func2.c
    • ar cr libhello.a func1.o func2.o
  • ar -t

  • 搜索路径

    • 在这里插入图片描述
  • gcc -Wall main.c libhello.a -o hello

  • 注意省略形式的前提时库文件在系统的库文件目录

    • 在这里插入图片描述
  • gcc -Wall main.c -L. -lhello -o h2

    • 通过-L.指定在当前目录,注意是紧跟着要查找的目录
      • 在这里插入图片描述

g++

在这里插入图片描述

gdb

  • -g将调试信息保存到目标文件中。
  • gdb ./a.out
  • run r 运行
  • next n 下一个断点
  • 打印:print:p arr[0]
  • 断点break b
    • 在函数处打断点:b 函数名
    • 在哪一行打断点:b 行数
    • 已经在哪些行下打断点了
      • info b
  • quit 退出
  • list 查看程序
  • 进入函数 steps

gdb调试技巧

  • gdb下可以写shell

    • shell ls
    • shell cat test.c
  • 日志功能呢

    • set logging on 将gdb调试后的输出都输出到gdb.txt中
  • watchpoint

    • 观察变量是否变化
    • 在这里插入图片描述
  • 调试崩掉的程序

    • 默认不会生成core文件

      • 通过ulimit -a查看在这里插入图片描述
    • 打开core文件

      • ulimit -c unlimited
  • 调试正在运行的程序

    • 在这里插入图片描述

优化

  • 关闭返回值优化
    • 返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制:
      当函数需要返回一个对象的时候,如果自己创建一个临时对象用户返回,那么这个临时对象会消耗一个构造函数(Constructor)的调用、一个复制构造函数的调用(Copy Constructor)以及一个析构函数(Destructor)的调用的代价。而如果稍微做一点优化,就可以将成本降低到一个构造函数的代价,这样就省去了一次拷贝构造函数的调用和依次析构函数的调用。

    • -fno-elide-constructors"

源码层次优化

在这里插入图片描述
在这里插入图片描述

机器码层次优化

在这里插入图片描述

gcc如何实现优化

在这里插入图片描述

三个等级

  • 不优化
    • -o0
    • -o1
    • 日常系统设置为 -o2
    • -o3

makefile

  • make是一个命令工具,它解释生成文件设置为中的指令。在生成文件文件中描述了整个工程所有文件的编译顺序、编译规则
  • 在这里插入图片描述

hello world

  • 语法
  • 在这里插入图片描述
a:
     @echo  "hello world"

输出 hello world
@ 符号用于抑制命令的回显。如果不使用 @,make 会在执行命令之前先打印出命令本身

a:
     echo  "hello world"

输出
echo “hello world”
hello world

  • make 默认编译选择的是第一个

    a:
      @echo  "hello world"
    
    b:
      @echo "hello b"
    
  • make b 编译第二个

  • 依赖

    a:b
      @echo  "hello world"
    
    b:
      @echo "hello b"
    
    c:
      @echo "hello c
    

    输出:
    hello b
    hello world

  • 命令

	a:b
	  @echo  "hello world"
	  @ls ./
	  gcc main.cpp
  • 一般我们在执行之前会删除以前生成的文件:make clean
a:
	@echo "11"
clean:
	rm -rf a.out

make常用选项

在这里插入图片描述

编译流程

在这里插入图片描述

calc:
  g++ add.cpp sub.cpp multi.cpp calc.cpp -o calc
  • 上面这样写不好

    calc:add.o sub.o multi.o
      g++ add.o sub.o multi.o calc.cpp -o calc
    
    add.o:add.cpp
      g++ -c add.cpp -o add.o
    
    sub.o:sub.cpp
      g++ -c sub.cpp -o sub.o
    
    multi.o:multi.cpp
      g++ -c multi.cpp -o multi.o
    
    • 输入命令:make

    • 执行g++ -c add.cpp -o add.o
      g++ -c sub.cpp -o sub.o
      g++ -c multi.cpp -o multi.o
      g++ add.o sub.o multi.o calc.cpp -o calc

    • 当只是修改add.c时,输入make,执行

    • g++ -c add.cpp -o add.o
      g++ add.o sub.o multi.o calc.cpp -o calc

makefile中的变量

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

TARGET=calc
$(TARGET):add.o sub.o multi.o
        g++ add.o sub.o multi.o calc.cpp -o calc
TARGET=calc
OBJ=add.o sub.o multi.o
$(TARGET):$(OBJ)
        g++ add.o sub.o multi.o calc.cpp -o calc

add.o:add.cpp
        g++ -c $^ -o $@

sub.o:sub.cpp
        g++ -c $^ -o $@

multi.o:multi.cpp
        g++ -c $^ -o $@

  • ?=条件赋值
    • ?= 操作符用于条件赋值。它的作用是:如果变量尚未被赋值,则给它赋一个默认值;如果变量已经有一个值,则保持不变在这里插入图片描述

Makefile中的伪目标和模式匹配

在这里插入图片描述

伪目标

  • 引入
    calc:add.o  multi.o
    	g++ add.o  multi.o calc.c -o calc
    	
    add.o:add.c
    	g++ -c add.c -o add.o
    	
    multi.o:multi.c
    	g++ -c multi.c -o multi.o
    clean:
    	rm -rf *.o *.exe
    
  • 执行make clean删除文件.o和.exe
  • 但是当所在目录中存在文件名为clean的文件时
    • make: 'clean' is up to date. 执行不了
  • 加入
    .PHONY:clean
    calc:add.o  multi.o
    	g++ add.o  multi.o calc.c -o calc
    	
    add.o:add.c
    	g++ -c add.c -o add.o
    	
    multi.o:multi.c
    	g++ -c multi.c -o multi.o
    clean:
    	rm -rf *.o *.exe
    

模式匹配

.PHONY:clean
OBJ=add.o multi.o calc.o
TARGET=calc

$(TARGET):$(OBJ)
	$(CXX)  $^ -o  $@
add.o:add.c
	$(CXX) -c $^ -o $@
multi.o:multi.c
	$(CXX) -c $^ -o $@
calc.o:calc.c
	$(CXX) -c $^ -o $@

clean:
	rm -rf *.o *.exe
  • 加入通配符之后
    .PHONY:clean
    OBJ=add.o multi.o calc.o
    TARGET=calc
    
    $(TARGET):$(OBJ)
    	$(CXX)  $^ -o  $@
    %.o:%.c
    	$(CXX) -c $^ -o $@
    
    clean:
    	rm -rf *.o *.exe
    
    在这里插入图片描述

wildcard 与pastsubst

在这里插入图片描述

  • 在 Makefile 中,wildcard 函数用于查找匹配给定模式的所有文件名。这对于自动收集源文件列表特别有用,这样就不必手动列出所有的文件。wildcard 函数返回一个空格分隔的字符串,其中包含所有匹配模式的文件名。
    • 在这里插入图片描述
    • patsubst在这里插入图片描述
    • 在这里插入图片描述

makefile中编译动态链接库

在这里插入图片描述
动态链接库的名字:
SoTest.cc libSoTest.so

  • 生成动态链接库: g++ -shared -fPIC .\SoTest.cc -o libSoTest.so 或者g++ -shared -fPIC .\SoTest.cpp -o libSoTest.dll 注意在windows下应该生成.dll

  • 编译并生成共享库
    g++ -shared -fPIC SoTest.cpp -o libSoTest.so

  • 编译并链接 test.cpp:
    g++ test.cpp -o test -L. -lSoTest
    在这里插入图片描述

  • 法1:

    • 假设你的 libSoTest.so 在当前目录下,你可以使用以下命令:
    	export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    	./test 
    

在这里插入图片描述

  • makefile
    test:libSoTest.so
    	$(CXX) -lSoTest -L./ test.cpp -o test
    
    libSoTest.so:
    	$(CXX) -fPIC -shared SoTest.cpp -o libSoTest.so
    
    clen:
    	$(RM) *.so test
    
    

makefile中编译静态链接库

在这里插入图片描述

  • 输出目标文件
    • g++ -c aTest.cc -o aTest.o
  • 生成静态链接库
    • ar -r libaTest.a aTest.o
  • g++ main.cpp -o main -L./static -laTest
  • 以下编译不通过(注意-l和-L在后面)
    • g++ -laTest -L./static main.cpp -o main 在这里插入图片描述

    • 在这里插入图片描述

    • 修改之后依然可以运行在这里插入图片描述

    • 但是动态链接库修改了就不能运行

    • 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

makefile的编写
libaTest:
	${CXX} -c aTest.cpp -o aTest.o
	${AR} -r libaTest aTest.o

clean:
	${RM} *.o *.a

在这里插入图片描述

  • 简写
TARGET=main
LDFLAGS=-L./static
LIBS=-laTest

${TARGET}:
#	${CXX}  main.cpp -o main -laTest -L./static
	${CXX} main.cpp -o ${TARGET}

Makefile运行流程

在这里插入图片描述

静态库

  • Linux 是.a.windos是.lib
    在这里插入图片描述

动态库

  • Linux 是.so.windos是.dll

在这里插入图片描述

CMake

爱编程的大丙

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值