ubuntu下用makefile生成的执行文件如何调试?

作者&投稿:项虞 (若有异议请与网页底部的电邮联系)
linux多文件用makefile编译后,生成.exe文件。怎么用gdb进行单步调试或者有什么别的工具可以进行单步调试~

gdb 执行文件 #进入gdb调试
b 函数名 #设置函数断点
r #运行程序
n #单步调试
c #运行到下一个断点

出现的原因是导入的此makefile工程不是debug模式的,所以不包含调试信息,自然不能打断点调试了。因此,要解决这个问题就要考虑如何修改CMakeLists.txt使其生成的makefile文件进而生成Debug模式下的带调试信息的可执行程序;
我们先写一个简单的测试例子来测试一下,如何加调试信息:
假设文件结构如下:


./test6
|
+ ------ CmakeLists.txt
+ ------ main.cpp

+ ------ src_a
|
+ ------ CmakeLists.txt
+ ------ Testa.h
+ ------ Testa.cpp

+ ------ src_so
|
+ ------ CmakeLists.txt
+ ------ Testso.h
+ ------ Testso.cpp




第一步:test6目录下CmakeLists.txt


cmake_minimum_required(VERSION 3.3)

project(main )

add_subdirectory(src_a ) // 给当前工程目录添加子目录 src_a
add_subdirectory(src_so ) // 给当前工程目录添加子目录 src_so

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息

set(EXECUTABLE_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置可执行文件的生成路径

include_directories($ {PROJECT_SOURCE_DIR}/src_a ${PROJECT_SOURCE_DIR}/src_so) //包含库头文件

aux_source_directory(. DIR_SRCS ) // 将当前目录中的源文件名称赋值给变量 DIR_SRCS
add_executable(main $ {DIR_SRCS}) //表示 DIR_SRCS中的源文件需要编译成名为 main的可执行文件

target_link_libraries (main Testa Testso) //将库文件链接到生成的目标可执行文件



第二步:子目录目录下CmakeLists.txt
1,src_a中静态库的编译生成

cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息

set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 静态库生成路径

aux_source_directory(. LIBA_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testad STATIC $ {LIBA_SRC}) //将变量 LIBA_SRC中的源文件编译为静态库,库文件名称为 Testa



2,src_so中动态库的编译生成

cmake_minimum_required(VERSION 3.3) //该命令限定了 CMake 的版本

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") //添加调试信息

set(LIBRARY_OUTPUT_PATH $ {PROJECT_SOURCE_DIR}/bin) //设置Lib 动态库库生成路径

aux_source_directory(. LIBSO_SRC) //将当前目录中的源文件名称赋值给变量 LIBA_SRC
add_library(Testsod SHARED $ {LIBSO_SRC}) //将变量 LIBA_SRC中的源文件编译为动态库,库文件名称为 Testso



此处执行cmake时有两种方式:

1,在cmake的gui界面中设定生成Debug模式,
2,在执行cmake时使用如下命令:cmake -DCMAKE_BUILD_TYPE=Debug/Release path

关于ccmake的使用,这里简单的做个说明:
1.首先在终端启动cmake的gui界面:"ccmake ." 效果如图:


2.然后在gui中输入"c",效果如图:


3.然后在gui中输入"e",效果如图:


4.此时在gui界面点击"enter"回车键进行编辑:编辑完再次点击回车退出编辑。


5.点击"c",之后再次点击"g"。此时makefile文件已经生成好了。make之后生成的可执行文件是带有调试信息的,就可用gdb进行调试了(导入Eclipse也可以进行打断点调试)。

在Windows下,只需要简单的点击以下make,rebuild即可。而在Linux下,这样的IDE环境并没有提供,难道必须每一步都执行一遍吗?比较ok的做法自然是能够利用批处理脚本来进行操作了,这样,只需要修改脚本中需要编译的文件即可。在Linux下,提供了这么一个方便的工具,make。那么接下来我们来利用make进行程序的组织编译吧。
1. 编写tool.h
1
2
3
4
5
6
#ifndef __TOOL_H
#define __TOOL_H

void printInteger(int number);

#endif // end of tool.h
2. 编写tool.c
1
2
3
4
5
6
7
#include "tool.h"
#include "stdio.h"

void printInteger(int number)
{
printf("the number is:%d\n",number);
}
3. 编写main.c
1
2
3
4
5
6
7
8
9
10
11
#include "tool.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
int number;
number=10;
printf("Context-Type:text/html\n\n");
printInteger(number);
return 0;
}
4. 编译链接文件生成可执行文件main
方法1:
命令行中进行编译
4.1.1 编译main.c生成main.o
sudo cc -c main.c
4.1.2 编译tool.c生成tool.o
sudo cc -c tool.c
4.1.3 链接main.o和tool.o生成main可执行文件
sudo cc -o main main.o tool.o
4.1.4 运行main
sudo ./main
方法2:
makefile进行编译链接
4.2.1 编写makefile文件(没有后缀名)
#MakeFile
main: main.o tool.o

main.o: main.c tool.h
cc -c main.c

tool.o: tool.c tool.h
cc -c tool.c

.PHONY:clean
clean:
rm *.o main
4.2.2 运行make进行编译链接
sudo make
4.2.3 运行main

sudo ./main
4.2.4 删除所有.o文件并再次编译

sudo make clean
sudo make


为什么我在ubuntu 14下写的C语言程序报“undefined reference to strcpy...
strcpy_s是VC新版本的函数, 不是标准库函数, 把后面的_s去掉.

树莓派是什么
树莓派早期有A和B两个型号,主要区别:A型:1个USB、无有线网络接口、功率2.5W,500mA、256MB RAM;B型:2个USB、支持有线网络、功率3.5W,700mA、512MB RAM。树莓派model B+ 树莓派model B+ 2014年7月和11月树莓派分别推出B+和A+两个型号,主要区别:Model A没有网络接口,将4个USB端口...

WIN7下安装linux出现[Minma]BASH-like line editing is supported_百度...
WIN7下安装linux出现[Minma]BASH-like line editing is supported是设置错误造成的,解决方法为:1、运行UltraISO软件,点击文件打开,并找到Cyborg Hawk Linux的系统。2、完成上步后,插入U盘,选择上方的“启动”--“写入硬盘映像”。3、在弹出的窗口中进行如下图设置,刻录校验:打上对号写入方式:USB...

Win10中使用VSCode + Remote-SSH + Linux服务器远程开发
具体步骤:本机操作环境:Windows 10 1909(此版本的系统自带SSH)远程机器环境: Ubuntu18.04 常规插件安装如下:其他的配置使用 Ctrl+Shift+P ,选自 setting(JSON)这里远程机器可以是使 VirtualBox 中安装的 ubuntu18.04 , 也或者是同一个网络中的其他Linux机器. 并且Linux机器上需要如下配置:在Windows...

树莓派的各版本具体参数
由于CPU已经升级到 ARM Cortex-A7 系,所以树莓派2将支持运行全系列的 ARM GNU\/Linux 发行版。包括 Ubuntu 甚至 微软的 Windows 10。 2016年2月,“树莓派3B版本发布。● 搭载1.2GHz 的64位四核处理器(ARM Cortex-A53 1.2GHz 64-bit quad-core ARMv8 CPU)。● 增加802.11 b\/g\/n无线网卡...

混合型\\股票型基金有什么办法可以实时查看涨跌走势? 和指数型基金一样...
下文我主要是以股票代码举例,换成基金代码也是可以的,实时关注!Ref===>tushare系统:Ubuntu 15.04 Python:2.7 环境包:Anaconda,仅供娱乐...最近在学习Python语言,刚好也想学学炒股,因此学习了一些基础知识后,打算做一些股票相关的demo练手,第一个要解决的问题当然是数据采集。翻遍了网络,看了...

密密麻麻的近义词是什么
汉语中的近义词,如同满园的鲜花,五彩纷呈,香气各异,只要精心选用,恰当布局,就能充分表达思想感情,使文章生辉。下面和我一起来看密密麻麻的近义词是什么,希望有所帮助!密密麻麻拼音和解释:(A)、词语密密麻麻的拼音: mi mi ma ma ;(B)、词语密密麻麻的解释:(密密麻麻的)又多又密(多指小的...

linux shell编程书籍推荐
在本书的再版中,Quigley对她的经典著作进行了全新的改版,增加了当前shell程序员所需的最新内容——...本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程...Linux中非shell程序的用户认证机制 9.7 小结 第4部分 服务器的安全问题 第10章 邮件安全性 10.1 Ma....

请教Linux Ubuntu高手一个“安装搜狗拼音输入法报错如何调试”的问题...
!\/bin\/bashwget -c http:\/\/cdn2.ime.sogou.com\/dl\/index\/1524572264\/sogoupinyin_2.2.0.0108_amd64.deb?st=24frocf4nQMw3_ZhDOxGcQ&e=1533792174&fn=sogoupinyin_2.2.0.0108_amd64.debdpkg -i sogoupinyin_2.2.0.0108_amd64.debsudo apt-get -f installdpkg -i sogoupinyin_2.2.0....

关于macbook pro的一系列问题
2,装双系统的话,会影响到速度 3,这些都是型号,区别在于内配,还有是XX年的款式 4,13inch的那个本,对于设计的来说绝地是不够用的,并且MACBOOK PRO不是一款游戏本,尤其是大型游戏,这样你不仅会抱怨本子不给力,还会后悔,虽然在图形显示上是所有笔记本中相比来说相当出色的,但是注定是设计方面...

大方县17348056112: Ubuntu系统下如何运行(运行!!)Makefile文件? -
彭贱葶苈: 比如你/home/test这个目录下有.c和.h文件,然后你在该目录下,编写了相应的Makefile文件,那你只要打开一个终端,然后输入: cd /home/test make 就可以运行这个Makefile了.

大方县17348056112: ubuntu下用makefile生成的执行文件如何调试? -
彭贱葶苈: 在Windows下,只需要简单的点击以下make,rebuild即可.而在Linux下,这样的IDE环境并没有提供,难道必须每一步都执行一遍吗?比较ok的做法自然是能够利用批处理脚本来进行操作了,这样,只需要修改脚本中需要编译的文件即可.在...

大方县17348056112: 如何在ubuntu下用makefile开发stm32 -
彭贱葶苈: 在Ubuntu下寻找Nucleo的串口号. 安装常用的串口软件.minicom,putty. 安装st-link在Ubuntu下的驱动程序.包括下载用的st-flash,调试用的st-util. 安装arm-none-eabi-xxx.使用Makefile进行简单的工程管理.固件库准备 编写Makefile 编写...

大方县17348056112: 怎么在ubuntu在编辑makefile文件 -
彭贱葶苈: 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件.makefile是一种特殊的...

大方县17348056112: ubuntu中C++编译器,怎么用?
彭贱葶苈: 你说的是哪个编译器? 通用的就是GCC G++, 只要在C++文件同文件夹下编个MAKEFILE就可以了.然后命令行里面直接make一下就可以了(先定位到该文件夹下),MAKEFILE具体简单编写方法网上搜一下就有. 再简单一点就直接 定位到文件夹下,写g++ -o 生成的运行文件的名字 你的C++文件名 然后直接运行就好了.比如你的文件为a.cpp 生成 a.out 则 gcc -o a.out a.cpp 回车 然后./a.out 就运行了.

大方县17348056112: ubuntu中C++编译器,怎么用? -
彭贱葶苈: 终端,g++ --help man g++

大方县17348056112: linux 怎么找到makefile -
彭贱葶苈: c中写的是Hello World!makeLinux系统下makefile的作用把编写好的源文件进行编译与链接:target… :prerequisite…(Tab键)command#格式解释 target:生成的目标文件,可以是可执行文件:gcc –c hello.c:编译command目录下的hello.c源文件...

大方县17348056112: 如何在Ubuntu下编译生成自己创建的Cocos2dx项目
彭贱葶苈: 刚开始对makefile不熟悉,结果弄了好久才弄好,在这里记录一下,顺便也给那些有需要的人做一个参考,不要走太多的弯路. 首先运行create-android-project.sh创建一个新的项目,我比较喜欢把项目放在一起,比较好管理,所以我把新建的项...

大方县17348056112: 在Ubuntu上做内核编程,要安装哪个包?怎么做?
彭贱葶苈: 1、gcc (C编译器) 安装 apt-get install gcc 2、make (源代码维护工具,它能自动检测出需要重新编译的源文件并根据你设定的编译规则去重新编译程序) 安装 apt-get install make 3.kernel-source (内核源码包.你可以apt-cache search kernel-...

大方县17348056112: linux下如何用make生成可执行文件x -
彭贱葶苈: 先运行configure脚本生成Makefile编译配置文件 然后执行make命令,make会自动读取上一步生成的Makefile编译链接源代码 最后执行make install命令,make还是去读取Makefile,提取里面的install参数的定义,复制编译链接好的二进制文件到Makefile定义的位置并更改必须的权限.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网