文档章节

在 Makefile 里加入调试选项

sfyumi
 sfyumi
发布于 2014/06/04 21:38
字数 311
阅读 1462
收藏 2
点赞 0
评论 0

gcc 编译选项

-c            Compile and assemble, but do not link
-o <file>     Place the output into <file>
-g            Generate debug information in default format

简单的 Makefile 一般只用到前两项 gcc 选项,如果需要调试程序的话就用到第三个调试选项了。

一个简单的 Makefile示例

此工程由三个文件组成:

printHello.h
printHello.c
main.c

printHello.h

void printHello();

printHello.c

#include <stdio.h>                                 
void printHello(){
    printf("Hello World!\n");
}

main.c

#include "printHello.h"
int main() {
    printHello();
    return 0;
}

Makefile(带调试选项)

hello : main.o printHello.o
    cc -o hello main.o printHello.o

main.o : main.c printHello.h
    cc -c -g main.c

printHello.o : printHello.c
    cc -c -g printHello.c

clean : 
    rm hello main.o printHello.o


扩展知识:

gcc编译过程分为四步

预编译过程:处理宏定义和include,并做语法检查。

编译过程:生成汇编代码。

汇编过程:生成中间目标代码。(-c)

连接过程:生成可执行代码。(-o)

关于 Makefile,可以看一下陈皓的跟我一起写 Makefile 系列文章

GDB 调试也可以看一看陈皓的用 GDB 调试程序系列文章

© 著作权归作者所有

共有 人打赏支持
sfyumi
粉丝 4
博文 12
码字总数 2324
作品 0
海淀
程序员
Linux内核模块LKM编译-自制Makefile模板

前段时间对内核的模块重新做了研究,对内核模块的编译流程也作了一定的了解,比起5年前有更深入的认识。 根据LDD3的内核模块makefile和原理说明,我根据自己的需要做了适当的修改使得这个Mak...

nothingfinal ⋅ 2012/06/13 ⋅ 0

深入理解软件包的配置、编译与安装【转】

从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将...

长平狐 ⋅ 2013/06/03 ⋅ 0

Windows下编译 libevent 64位静态库

按照libevent的文档,使用VC的nmake -f Makefile.nmake即可编译32位release模式。 因为项目中要求编译64位的版本,需要在Makefile.nmake中添加一个LIBFLAGS选项 /MACHINE:X64 如果要加调试信...

雅各宾 ⋅ 2013/07/23 ⋅ 0

C++(qt)游戏实战项目:坦克大战(四)

屏幕上光有地图也不行,还需要我们的坦克加入其中 新建tank.h和tank.cpp tank.h里加入 tank.cpp main.h结构体Glo中加入选项Tank *player. mainwindow.h里加入 mainwindow.cpp构造函数里加入 ...

qq_26046771 ⋅ 2017/06/03 ⋅ 0

深入理解软件包的配置、编译与安装方法

从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将...

JavaGG ⋅ 2009/05/07 ⋅ 0

Eclipse中使用自己的makefile管理工程

我用的环境: (1)系统: Ubuntu 11.04 (2)Eclipse + CDT 1. 在建立工程的时候选择makefile工程。 2.将makefile文件和你写好的工程文件(源文件和头文件)导入到刚刚创建的工程中。 3. 如...

苗永超 ⋅ 2014/11/25 ⋅ 0

KDevelop调试NS-2

调试NS-2的方法有很多,常用的有两种,gdb 和 kdevelop,前者是基于文本调试方式, kdevelop是集成开发环境,如VC集成开发环境一样,源代码的编写,编译,调试都可以轻松地完成,接下来介绍一...

许风恩 ⋅ 2012/06/02 ⋅ 0

Linux工具 gcc makefile gdb

gcc GNU下的编译链接工具套组 源文件为 test.c 一个完整的编译链接生成test文件的过程如下 gcc -E -o test.i test.c # 预处理 .c->.i gcc -S -o test.S test.i # 编译 .i->.S gcc -c -o tes...

hakase ⋅ 2016/09/05 ⋅ 0

CppUTest 入门教程

首次测试 在做第一次测试的时候,你需要新建一个cpp文件,并写好TEST_GROUP和TEST方法,如下: TEST_GROUP(FirstTestGroup){}; TEST(FirstTestGroup, FirstTest){FAIL("Fail me!");} 很明显此...

迷途d书童 ⋅ 2012/05/03 ⋅ 3

针对Web服务器总体优化

一、文件系统 在fstab里加入noatime,如 #cat /etc/fstab /dev/sda1 /home ext3 noatime,defaults 1 2 reboot或者重新mount生效 二、Tcp优化 在/etc/sysctl.conf里加入 net.ipv4.netfilter.i......

范堡 ⋅ 2009/05/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 35分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 55分钟前 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部