
gccgdbmakefile
huangyimo
这个作者很懒,什么都没留下…
展开
-
Makefile--基本规则(零)
一般一个稍大的linux项目会有很多个源文件组成,最终的可执行程序也是由这许多个源文件编译链接而成的。编译是把一个.c或.cpp文件编译成中间代码.o文件,链接是就使用这些中间代码文件生成可执行文件。比如在当前项目目录下有如下源文件:123# ls common.h debug.c debug.h ipc.c ipc.h main.c tags timer.c timer.h t...转载 2018-03-27 17:03:49 · 313 阅读 · 0 评论 -
Makefile--隐含规则自动推dao(一)
上一节的Makefile勉强可用,但还写的比较繁琐,不够简洁。对每一个.c源文件,都需要写一个生成其对应的.o目标文件的规则,如果有几百个或上千个源文件,都手动来写,还不是很麻烦,这也不够自动化啊。这样,我们把生成.o目标文件的规则全部删除掉,就是这样一个Makefile文件:12345target_bin : main.o debug.o ipc.o timer.o tools.o >--...转载 2018-03-27 17:06:02 · 241 阅读 · 0 评论 -
makefile--变量的使用(二)
仔细研究我们的之前Makefile发现,我们还有改进的地方,就是此处:12target_bin : main.o debug.o ipc.o timer.o tools.o >---gcc -o target_bin main.o debug.o ipc.o timer.o tools.o 如果增加一个源文件xx.c的话,需要在两处或多处增加xx.o文件。我们可以使用变量来解决这个问题。...转载 2018-03-27 17:07:54 · 240 阅读 · 0 评论 -
Makefile--伪目标 (三)
一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件。我们在第一节的Makefile就用到了这个 clean目标,该目标没有任何依赖文件,并且该目标对应的命令执行后不会生产clean文件。像这种特点目标,它的规则所定义的命令不是去创建文件,而仅仅通过make指定目标来执行一些特定系统命令或其依赖为目标的规则(如all),称为伪目标。一个Makefile一般都不会...转载 2018-03-27 17:08:55 · 433 阅读 · 0 评论 -
makefile--嵌套执行(四)
在大一些的项目里面,所有源代码不会只放在同一个目录,一般各个功能模块的源代码都是分开的,各自放在各自目录下,并且头文件和.c源文件也会有各 自的目录,这样便于项目代码的维护。这样我们可以在每个功能模块目录下都写一个Makefile,各自Makefile处理各自功能的编译链接工作,这样 我们就不必把所有功能的编译链接都放在同一个Makefile里面,这可使得我们的Makefile变得更加简洁,并且编...转载 2018-03-27 17:09:56 · 503 阅读 · 0 评论 -
makefile--参数传递、条件判断、include (五)
在多个Makefile嵌套调用时,有时我们需要传递一些参数给下一层Makefile。比如我们在顶层Makefile里面定义的打开调试信息变量 DEBUG_SYMBOLS,我们希望在进入子目录执行子Makefile时该变量仍然有效,这是需要将该变量传递给子Makefile,那怎么传递呢? 这里有两种方法:1. 在上层Makefile中使用”export”关键字对需要传递的变量进行声明。比如:...转载 2018-03-27 17:11:46 · 1351 阅读 · 0 评论 -
makefile--统一目标输出目录 (六)
上一节我们把规则单独提取出来,方便了Makefile的维护,每个模块只需要给出关于自己的一些变量,然后再使用统一的规则Makefile。这一节我 们继续改进我们的Makefile,到目前为止我们的Makefile编译链接输出的目标都在源文件同目录下或模块Makefile同一目录下,当一个项 目大了之后,这样会显得很乱,寻找编译输出的文件也比较困难。既然Makefile本身就是按照我们的的规则来编译...转载 2018-03-27 17:12:32 · 4439 阅读 · 0 评论 -
makefile--模式规则(七)
上一节讲到目录创建成功,目标文件没有生产到对应目录下,这里我们先给目标文件加上对应目录,这样的话产生对应的目标文件会直接生成到对应目录。我们先给库文件目标和可执行文件目标加上路径,如下:123456789101112131415161718lib : $(OBJDIR) $(LIBDIR)/$(SRC_LIB) bin : $(OBJDIR) $(BINDIR)/$(SRC_BIN) ...转载 2018-03-27 17:13:25 · 342 阅读 · 0 评论 -
makefile--目录搜索(八)
在一个较大的工程中,一般会将源代码和二进制文件(.o 文件和可执行文件)安排在不同的目录来进行区分管理。这种情况下,我们可以使用 make 提供的目录搜索依赖文件功能(在指定的若干个目录下自动搜索依赖文件)。在Makefile中,使用依赖文件的目录搜索功能。当工程的目录结构发生变化 后,就可以做到不更改 Makefile的规则,只更改依赖文件的搜索目录。 在我们上一节出现的问题当中,我们将...转载 2018-03-27 17:15:20 · 420 阅读 · 0 评论 -
Makefile---make内嵌函数及make命令显示 (九)
这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard、patsubst、notdir、shell等。一般函数的调用格式如下:123$(funcname arguments)或$(funcname arguments)其中funcname是需要调用函数的函数名称,应该是make内嵌函数;arguments是函数参数,参数和函数名之间使用空格分割,如果存在多个参 数时,参数...转载 2018-03-28 09:52:33 · 589 阅读 · 0 评论 -
Makefile所有内嵌函数
一、文本处理函数以下是GNU make内嵌的文本(字符串)处理函数。1 $(subst FROM,TO,TEXT)函数名称:字符串替换函数—subst。函数功能:把字串“TEXT”中的“FROM”字符替换为“TO”。返回值:替换后的新字符串。示例:$(subst ee,EE,feet on the street)替换“feet on the street”中的“ee”为“EE”,结果得...转载 2018-03-29 10:52:08 · 444 阅读 · 0 评论 -
我所使用的一个通用的Makefile模板
话不多说,请看:我的项目有的目录结构有:dirls/├── include│ └── apue.h├── lib│ ├── error.c│ ├── error.o│ └── Makefile├── src│ ├── dirls.c│ ├── dirls.out│ └── Makefile└── test_client而我的Makefile模板代码...转载 2018-03-29 14:13:02 · 329 阅读 · 0 评论 -
Makefile中的几个调试方法
1,使用info/warning/error增加调试信息方法1: $(info, "here add the debug info") 但是此不能打印出.mk的行号方法2: $(warning, "here add the debug info") 方法3: $(error "error: this will stop the compile") 这个可以停止当前m...转载 2018-05-29 20:18:16 · 2989 阅读 · 0 评论 -
Makefile中的wildcard用法
在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN...) 。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展...转载 2018-05-29 20:47:05 · 2461 阅读 · 0 评论 -
Makefile中几种赋值(= := ?= +=)
变量的引用方式: ”$(变量名)“或者”¥{变量名}“ 例如: ${Objs}就是取变量Objs的值 注意: 当变量名为单字符是可以采用:“$a”的方式引用,多字符则不行Makefile中几种赋值(= := ?= +=)= 延时变量,只有被使用时才展开定义 := 立即变量,定义时的赋值立即有效 ?= 条件变量,当变量为空时才赋值 += 追加赋值示例:VAR_A=abcVAR_B=$(...转载 2018-05-29 21:17:37 · 975 阅读 · 0 评论 -
Makefile 使用总结
1. Makefile 简介Makefile 是和 make 命令一起配合使用的.很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂.Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作. 这个需要大家发挥自己的想象力. 本篇博客是基于 {精华} 跟我一起写 ...转载 2018-03-27 14:29:28 · 271 阅读 · 0 评论 -
函数库一般分为静态库和动态库两种。
静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库:与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,gcc/g++在编译时默认使用动态库。无论静态库,还是动态库,都是由.o文件创建的。 动态库的编...转载 2018-03-26 20:52:12 · 1791 阅读 · 0 评论 -
gcc/g++ 实战之编译的四个过程
gcc和g++分别是GNU(一个开源组织)的c&c++编译器对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序;对于.cpp后缀的文件,gcc和g++都会当做c++程序。gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译,但是g++无论是.c或.cpp都统一按c++程序来编译。编译阶段,g++会调用gcc,链接阶段通常会用g++来完成,g++在编译的过程中,...转载 2018-03-26 20:42:12 · 158 阅读 · 0 评论 -
Linux GCC常用命令
1简介GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compil转载 2016-08-08 19:46:26 · 270 阅读 · 0 评论 -
g++参数介绍
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s 编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件 汇编器as4.连接目标代码,生成可执行程序 连接器ld1.总体选项 -E 只...转载 2017-11-21 14:08:33 · 1769 阅读 · 1 评论 -
GCC编译器中的-I -L -l 选项
在本文中, 我们来聊聊gcc中三个常见的参数, 也即-I(大写的i), -L(大写的l)和-l(小写的l) 一. 先说 -I (注意是大写的i) 我们先来看简单的程序: main.c:[cpp] view plain copy#include #include转载 2017-11-21 14:14:40 · 1681 阅读 · 0 评论 -
Linux下Makefile的编写及四个特殊符号的意义@、$@、$^、$<
我们先看三段C++程序:一、line1的源码line1.h[cpp] view plain copy#ifndef _LINE_1_H #define _LINE_1_H void line1_print(const char *strMsg); #endif line1.c转载 2017-11-21 15:26:25 · 317 阅读 · 0 评论 -
Linux gdb调试器用法全面解析
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能:启动程序,可以按照工程师自定义的要求随心所欲的运行程序。让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。当程序被停住时,可以检查此时程序中所发生的事,并追索上文。动态地改变程序的执行环境。不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用转载 2018-01-23 21:03:59 · 214 阅读 · 0 评论 -
Linux下调试core文件的方法
在开发和使用Linux程序时,引擎有时会莫名其妙的core掉,在网上查了一下,整理了一个简单的调试core文件的方法1、什么是core dump?Core,即core memory, 指由一系列小当纳圈形的磁性材料组成的存储器,这里不过是沿用了这一称呼,而dump就是堆放的意思。core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存转载 2018-01-25 18:54:03 · 1210 阅读 · 0 评论 -
Linux基础 30分钟GDB调试快速突破
前言 gdb 开始调试开始上手1. 开启core, 采集程序崩溃的状态 首先你跟着我做开启core崩溃状态采集. 可以通过 ulimit -c 查看 如果是0表示没有开启. 开启按照下面操作su rootvi /etc/profileShift + Gi# No core files by default 0, unlimited is ooulimit转载 2018-01-23 22:10:10 · 191 阅读 · 0 评论 -
Vim/Vi常用操作(第二版)
周围同事不是用vim就是Emacs,你要是用一ultraedit,你都不好意思跟人家打招呼;什么插件呀,语法高亮呀,拼写检查呀,能给它开的都给它开着,就是一个字儿:酷。你说这么牛B一东西,怎么着学会也得小半年吧。半年!入门都远着呢,能学会移动光标就不错了,你还别说耗不起,就这还只是左右移动!!!Vim/Vi简介所有的Linux/UNIX都会默认安装Vi,现在主流的L转载 2018-02-05 22:06:57 · 199 阅读 · 0 评论 -
Linux 应用---make及makefile的编写
Make 在我们做linux 开发中是必不可少的一部分,它在我们编写大型项目工程文件中起到非常大的作用。 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译。 而Makefile是Make读入的唯一配...转载 2018-03-05 19:39:57 · 452 阅读 · 0 评论 -
Linux下C++的通用Makefile与解析
本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。所谓C++万能Makefile,即可编译链接所有的C++程序,而只需作很少的修改。号称万能Makefile,一统江湖。我对原版的Makefile做了些修改。首先揭开它的庐山真面目:##################################################### Generic makefile - 万能...转载 2018-03-05 20:15:48 · 241 阅读 · 0 评论 -
万能多用途简洁的Makefile
############################################################### 简洁通用的Makefile文件(Ver 1.1)## Smart Makefile for general purpose (Ver 1.1)## Author: 汤 永康 Yongkang TANG <tangyk%at%gmail>## Lice...转载 2018-03-05 20:36:34 · 251 阅读 · 0 评论 -
跟我一起写Makefile:使用变量
使用变量在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值。在Makefile中,变量可以使用在“目标”,“依赖目标”, “命令”或是Makefile的其它部分中。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有...转载 2018-03-05 21:02:51 · 254 阅读 · 0 评论 -
Makefile的简单编写
当我们的工程越来越大的以后,每次都使用命令编译显得非常的麻烦.所以我们需要一个自动化编译的工具来帮助我们编译.在我们使用源码安装软件的时候都会有make,make install等操作,这个就是使用Makefile来进行自动化编译的工作的.Makefile也是一个脚本文件和shell脚本非常的相似,但是也有很多的地方不一样.程序编译通常会有一下几个步骤,先是预编译,然后将C语言代码编译成汇编,然后...转载 2018-03-26 15:34:08 · 1180 阅读 · 0 评论 -
Makefile 静态模式——$(objects): %.o: %.c
静态模式最近看Makefile,正常依赖没什么问题,但是遇到一些特殊的符号就有点不明白了,例如:$(objects): %.o: %.c、$<之类的。最近看了篇文章写的不错,贴出来供大家分享。静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:<targets ...>: <target-pattern>: <...转载 2018-03-26 20:26:17 · 18886 阅读 · 5 评论 -
g++基本用法
用法:g++[选项]文件... g++编译流程: [cpp] view plain copymain.cxx #include <iostream> using namespace std; int main(void) { cout<<"Hello World!"<<en...转载 2018-01-22 22:48:59 · 6041 阅读 · 0 评论