最近网上看一本《Linux程序设计入门--网络编程》 学习一下gcc方面的知识
先试验一下makefile 怎么用的吧
/*mytool1.h*/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
viod mytool1_print(char *print_str);
#endif
/*mytool2*/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/*mytool1.c*/
#include "mytool1.h"
void mytool1_print(char *print_str);
{
printf("this is mytool1 print %s\n", print_str);
}
/*mytool2.c*/
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("this is mytool2 print %s\n", print_str);
}
/*main.c*/
#include "mytool1.h"
#include "mytool2.h"
int main(int argc, char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
这样五个文件 组成一个小的gcc程序,但是要是编译这样一个程序要用到以下命令:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
是比较复杂,没改变一个东西都要这样来一遍,更受不了了。
所以有了makefile ,这样把这样呀多次重复的工作,通过简单的方式来做,这样才能显现出计算机的意义才是。
在同一个文件夹中建立一个makefile的文件,没有 后缀名。
内容为:
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool2.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
这样就可以完成任务了,以上的makefile里的行都是成对出现的,第一行列出的是依赖关系,第二行是编译命令。
这样虽然解决了编译麻烦的问题(因为以后编译的时候,一个make指令搞定),但是这样一个makefile文件也够复杂的,呵呵!程序员就是能不复杂就简化它
同样的写就这么几句是不是清爽多了
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o
gcc -c $<
makefile 也就这么简单,以后编译就不再困难。
分享到:
相关推荐
后缀规则用于简化类似的构建规则,自动变量如$@代表目标文件,$<代表第一个依赖文件,它们可以在命令中使用,以简化命令行。 知识点八:Makefile的跨平台兼容性 Makefile中的变量和模式规则在设计时会考虑到不同...
这里 `%` 符号表示通配符,`$表示依赖文件列表的第一个文件,而 `$@` 表示目标文件。 #### 三、进阶技巧 随着项目规模的增长,Makefile 的编写也会变得更加复杂。下面是一些进阶技巧,可以帮助你更好地管理和维护 ...
`$代表第一个依赖项,也就是当前`.c`文件。 6. `clean`规则用于清理编译产生的临时文件。 当我们运行`make`时,它会根据`Makefile`自动检测文件的更新状态,只重新编译那些需要的文件,提高了开发效率。 在TCP通信...
4. **默认目标**:Makefile 默认执行的第一个目标,通常不需要明确指定。如果希望改变默认行为,可以通过 `make` 命令后跟目标名称来实现。 5. **伪目标**:用于标记的特殊目标,例如 `.PHONY` 定义的伪目标。伪...
- 第一行 `gcc -c hello.c -o hello.o` 用于将 `hello.c` 编译成 `.o` 文件。 - 第二行 `gcc hello.o -o hello` 用于将 `.o` 文件链接成可执行文件 `hello`。 - `clean` 目标用于清理生成的文件。 #### 五、...
在第一章“概述”中,介绍了一些准备知识,例如需要了解的基本编译原理,例如编译器、链接器等。此外,还提供了GNU Make的简介。 第二章“GNUmake介绍”具体介绍了Makefile的基础知识,包括Makefile的简要说明、...
`$代表第一个依赖项(.dot文件),`$@`代表目标(.png文件)。 这个Makefile可能还包含了其他选项,如支持SVG、PDF等不同格式的输出,只需更改`-T`后面的参数即可。此外,可能还有清理(clean)目标,用于删除生成...
1动手编写第一个makefile编译c++多文件项目 2g++分步编译演示从源码到执行程序的四步 3makefile运行流程分析并使用变量改写项目 4makefile自动推导目标代码配置和伪目标clean清理 5使用make编译动态链接库并编写测试...
第一章概述了Makefile的概念和准备知识。Makefile是GNU make用来控制软件编译过程的脚本文件,而准备知识可能涉及编译原理和Makefile的基础语法。 第二章介绍GNU make,包括Makefile的简介、规则介绍、简单的示例、...
#### 第一部分:概述 **Makefile**是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过编写Makefile,开发者可以定义一系列规则来描述如何编译和链接源代码文件,从而构建出最终的可执行文件或...
Makefile中的自动变量包括$@、$<、$^等,它们代表了目标、第一个依赖或所有依赖等。使用自动变量可以使Makefile更加简洁,减少重复的命令书写。 8. 特殊目标 Makefile中有几个特殊的目标,例如伪目标.PHONY,用于...
一个简单的示例显示了使用编译数据库帮助YCM对C / C ++进行语义完成。 用法 只需运行compiledb -nf make创建一个compile_commands.json,它将由YCM自动使用。 更多详细信息: 如何运行/清理该项目? make make run...
- 第一行定义了编译器为`gcc`。 - 第二行定义了编译选项`-Wall`,表示开启所有警告。 - `all: myprogram`表示`all`目标依赖于`myprogram`目标,即默认构建时将构建`myprogram`。 - `myprogram: main.o foo.o`表示`my...
1. **目标(Target)**:这是makefile中的第一条命令将要操作的文件,通常是可执行文件或者库文件。 2. **依赖文件(Dependency)**:目标文件依赖于这些文件,通常是源代码文件或头文件。 3. **规则(Rule)**:...
Makefile还支持规则链式,通过`$@`和`$来引用当前目标和第一个依赖: ```makefile %.o: %.c $(CC) $(CFLAGS) -c $$@ ``` 这个规则表示,对于任何`.c`文件,都可以生成对应的`.o`目标文件。 条件语句和函数也是...
模式规则允许使用通配符定义一个规则,自动变量则简化了命令行的书写,如$@表示目标文件名,$<表示第一个依赖文件名等。 学习Makefile的过程中,可以通过分析实际的项目中的Makefile来加深理解。例如,Linux内核...
当make运行时,它首先检查makefile中指定的默认目标,通常是第一个目标。make会检查每个目标的依赖是否比目标更新,如果是,make将执行目标下的命令来更新目标。命令需要在新的shell中执行,所以每个命令前面都需要...
创建"hello"项目的第一步,我们需要编写一个简单的C程序,如`hello.c`,其内容可能如下: ```c #include int main() { printf("Hello, World!\n"); return 0; } ``` 接下来,我们将为这个项目编写Makefile。一...