linux下C++程序的编译编辑和调试基础知识(g++,makefile,gdb)

本文介绍了在Linux系统中使用g++、makefile和gdb进行C++程序的编辑、编译和调试。内容涵盖g++的基础用法,包括编译release和debug模式;makefile的编写,从基础到高级版本,用于自动化编译过程;以及gdb调试器的使用,如设置断点、运行和单步执行等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编辑:用记事本 或vim 等

编译:用g++ 或 makefile

调试: gdb  (gdb是比较粗糙的调试器)

一、g++的使用

      1.  g++  test.cpp   这样是不能编译的,除非test.cpp的含义是指所有的文件,包括链接文件。

           其实和windows下编译程序一样,windows编译程序时,每一个cpp会生成对应的一个obj,有多少个cpp就会生成多少个obj,然后这些obj文件又会链接成为一个exe文件,整个过程就结束了。 linux下编译也类似,因此不能用g++ test.cpp这样的方式编译成功,除非test.cpp的含义是指所有的文件,包括链接文件。因为g++ test.cpp这句命令的意思是说:编译并且链接test.cpp,编译完了马上就会去链接。而一个cpp文件是不能生成执行文件的,甚至有可能连main函数都找不到(main函数在另外的Cpp里)

      2.     g++  -c   test.cpp    编译release模式,编译后的结果为 test.o

              g++ -c -g  test.cpp   编译debug模式,大小约是release模式的两倍

              g++ *.o   -o run.exe  把所有的.o文件链接为run.exe,或者g++   -o run.exe  *.o 也可。 -o 和run.exe始终要在一起,他们俩可以在最末尾,也可以在g++后面

 二、makefile的编写和使用

    假设现在有Admin.cpp,Manager.cpp,SockLx.cpp,Test.cpp,Worker.cpp.应该这样来编写makefile文件:

Server.exe:Admin.o Manager.o SockLx.o Test.o Worker.o
    g++ Admin.o Manager.o SockLx.o Test.o Worker.o -o Server.exe(或者g++ *.o -o Server.exe)
Admin.o:Admin.cpp
    g++ -c Admin.cpp
Manager.o:Manager.cpp
    g++ -c Manager.cpp
SockLx.o:SockLx.cpp
    g++ -c SockLx.cpp
Test.o:Test.cpp
    g++ -c Test.cpp
Worker.o:Worker.cpp
    g++ -c Worker.cpp

rebuild:clean Server.exe
clean:
    rm -f *.o *.exe

在makefile文件中,A:B的意思是if(A<B),指的是A的生成时间小于B的生成时间。注意g++前面是一个tab键,而不是几个空格。

使用时,在终端输入make或者make rebuild或者make clean命令实现make或者重新make或者清理的功能.

 

更高档的makefile文件编写(宏替换)

以下是第一个改造版本,定义一个OBJ变量来表示所有的.o文件。

OBJ=Admin.o Manager.o SockLx.o Test.o Worker.o
Server.exe:$(OBJ)
    g++ $(OBJ) -o Server.exe
Admin.o:Admin.cpp
    g++ -c Admin.cpp
Manager.o:Manager.cpp
    g++ -c Manager.cpp
SockLx.o:SockLx.cpp
    g++ -c SockLx.cpp
Test.o:Test.cpp
    g++ -c Test.cpp
Worker.o:Worker.cpp
    g++ -c Worker.cpp

rebuild:clean Server.exe
clean:
    rm -f *.o *.exe

 使用时,在终端输入make或者make rebuild或者make clean命令实现make或者重新make或者清理的功能.

 

 

  以下是第二个改造版本:

Server.exe:Admin.o Manager.o SockLx.o Test.o Worker.o
    g++ $^ -o $@
Admin.o:Admin.cpp
    g++ -c $<
Manager.o:Manager.cpp
    g++ -c $<
SockLx.o:SockLx.cpp
    g++ -c $<
Test.o:Test.cpp
    g++ -c $<
Worker.o:Worker.cpp
    g++ -c $<

rebuild:clean Server.exe
clean:
    rm -f *.o *.exe

其中,$^表示所有依赖,$<表示第一个依赖,是冒号后面的部分,当只有一个依赖的时候这两个效果一样,比如对Admin.cpp,Manager.cpp,SockLx.cpp等的处理,因为只有一个cpp,所以所有依赖就是第一个依赖

 另外,$@表示目标文件,是冒号前面的部分

使用时,在终端输入make或者make rebuild或者make clean命令实现make或者重新make或者清理的功能.

 

以下是第三个改造版本

Server.exe:Admin.o Manager.o SockLx.o Test.o Worker.o
    g++ $^ -o $@
Admin.o:Admin.cpp
    g++ -c $<
Manager.o:Manager.cpp
    g++ -c $<
SockLx.o:SockLx.cpp
    g++ -c $<
Test.o:Test.cpp
    g++ -c $<
Worker.o:Worker.cpp
    g++ -c $<

rebuild:clean Server.exe
clean:
    $(RM) *.o *.exe

$(RM)中,RM是系统的宏,会自动替换为rm -rf

以下是第四个版本:

在公司里,*.o文件可能会放到某特定路径的obj文件夹下,*.exe文件可能会放到某特定路径的某bin文件夹下,这样就方便管理,因此可以如下编写:

ROOT=/home/test/System
OBJ=$(ROOT)/obj
BIN=$(ROOT)/bin

$(BIN)/Server.exe:$(OBJ)Admin.o $(OBJ)Manager.o $(OBJ)SockLx.o $(OBJ)Test.o $(OBJ)Worker.o
    g++ $^ -o $@
$(OBJ)/Admin.o:Admin.cpp
    g++ -c $< -o $@
$(OBJ)/Manager.o:Manager.cpp
    g++ -c $< -o $@
$(OBJ)/SockLx.o:SockLx.cpp
    g++ -c $< -o $@
$(OBJ)/Test.o:Test.cpp
    g++ -c $< -o $@
$(OBJ)/Worker.o:Worker.cpp
    g++ -c $< -o $@

rebuild:clean $(BIN)/Server.exe
clean:
    $(RM) $(OBJ)/*.o $(BIN)/*.exe

 

 

以下是第五个版本,这个版本加入了-g,即调试版本,用cc宏代替g++ -g  。如果到时候需要发行版,就把-g去掉就可以了。

ROOT=/home/test/System
OBJ=$(ROOT)/obj
BIN=$(ROOT)/bin
cc = g++ -g
$(BIN)/Server.exe:$(OBJ)Admin.o $(OBJ)Manager.o $(OBJ)SockLx.o $(OBJ)Test.o $(OBJ)Worker.o
    $(cc) $^ -o $@
$(OBJ)/Admin.o:Admin.cpp
    $(cc) -c $< -o $@
$(OBJ)/Manager.o:Manager.cpp
    $(cc) -c $< -o $@
$(OBJ)/SockLx.o:SockLx.cpp
    $(cc) -c $< -o $@
$(OBJ)/Test.o:Test.cpp
    $(cc) -c $< -o $@
$(OBJ)/Worker.o:Worker.cpp
    $(cc) -c $< -o $@

rebuild:clean $(BIN)/Server.exe
clean:
    $(RM) $(OBJ)/*.o $(BIN)/*.exe

 

 

三、gdb的使用 

   1.在终端输入 gdb totale.exe     ,意为准备调试total.exe,执行此句后会进入gdb环境,然后输入list会列出代码,输入q或quit会退出。

    注意,list,如果列出了代码,那就是debug模式,如果没有显示出来代码,那就是release模式。list命令可以帮我们判断当前的代码是debug还是release.

2. 进入gdb模式后,输入break 7表示在第7行插入断点,输入run表示运行,将停在断点位置

      输入next表示下一步(相当于vs中的F10),或者输入其首字母n也可以,gdb的这些命令很多都可以用首字母代替整个命令的。。

     输入step表示步入(相当于vs中的F11),步入以后,也可以输入list查看当前的代码内容。

3.若程序崩溃了,比如coredump,那么可在gbd 界面的coredump后输入"bt"查看coredump的详细信息,bt 是break  track的缩写。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值