Linux编程之Makefile(一)

我刚开始学Linux的时候,并没有用Makefile。写一个test.c ,然后直接gcc -o -g test test.c。后来文件一多,各种.c .h 文件。原来的方法是没法编译的。所以这时候就要靠Makefile。

先写一个简单的例子吧。现在有一段代码

#include<stdio.h>

int main(int args,char *argv[])
{
      printf("hello,world!!");
      return 0;
}

稍微插一段编译原理:首先你的.c到Linux可执行文件.elf 要经历的过程是:.h .c->.i->.o->elf

首先是预编译:加载头文件和动态链接库  。然后是汇编,编译,最后是链接

其实是这样:

gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o

现在动手写一个Makefile   直接vim Makefile

test 是目标文件,而test.c是依赖文件。下面的红色字体是命令。在Makefile中的命令,必须要以【tab】键开始!

想一想,Linux内核成千个.c .h也这样写岂不是要累死!!!

如何写一个比较通用的Makefile呢

先上一个Makefile再慢慢讲解吧  !!!

SRC      =$(wildcard *.c)
OBJS     =$(patsubst %.c,%.o,$(SRC))
CC        = gcc
CFLAGS = -Wall -g
LIBS      = -lpthread
DEFS     =
INCLUDE = -I ./
TARGET  = test
$(TARGET):$(OBJS)
    $(CC) $(CFLAGS) $(DEFS) $(INCLUDE) [email protected] -o $^  $(LIBS)
.PHONY:clean
clean:
    rm -rf  *.o $(TARGET)

红色字体是Makefile中的变量。使用变量的方式就是$(变量名)  [email protected]表示目标文件   $^表示第一个依赖文件   翻译一下:

$(CC)  $(CFLAGS)  $(DEFS)  $(INCLUDE)  [email protected]  -o  $^   $(LIBS) ==gcc  -Wall -g  -I ../ test -o test.c -lpthread

-I 表示加入的头文件即$(INCLUDE)   后面跟文件路径。           后面的$(LIBS)表示动态库。注意一下,这只是我起的名字,随便什么都可以的。

.PHONY表示伪目标

生成clean。clean 执行的是删除生成的文件。如果当前文件夹没有clean的文件,其实也可以不用加.PHONY。

wildcard是makefile中的函数,放在这里是取当前文件夹中的所有.c文件。

一点点文字只能大致描述一下。很多地方都没讲到。比如1.已经编译的一个项目,需要改一点东西,这时候makefile只会重新编译改了的文件。makefile会自动根据文件改动时间来判断的。2.在多目录结构下有多个makefile怎么来编译。等等。希望对读者有些帮助!!

原文地址:https://www.cnblogs.com/haibiandemoumoumou/p/11064883.html

时间: 2024-08-06 11:50:36

Linux编程之Makefile(一)的相关文章

Linux编程之ICMP洪水攻击

我的上一篇文章<Linux编程之PING的实现>里使用ICMP协议实现了PING的程序,ICMP除了实现这么一个PING程序,还有哪些不为人知或者好玩的用途?这里我将介绍ICMP另一个很有名的黑科技:ICMP洪水攻击. ICMP洪水攻击属于大名鼎鼎的DOS(Denial of Service)攻击的一种,一种是黑客们喜欢的攻击手段,这里本着加深自己对ICMP的理解的目的,也试着基于ICMP写一段ICMP的洪水攻击小程序. 洪水攻击(FLOOD ATTACK)指的是利用计算机网络技术向目的主机发

Linux编程之UDP SOCKET全攻略

这篇文章将对linux下udp socket编程重要知识点进行总结,无论是开发人员应知应会的,还是说udp socket的一些偏僻知识点,本文都会讲到.尽可能做到,读了一篇文章之后,大家对udp socket有一个比较全面的认识.本文分为两个专题,第一个是常用的upd socket框架,第二个是一些udp socket并不常用但又相当重要的知识点. 一.基本的udp socket编程 1. UDP编程框架要使用UDP协议进行程序开发,我们必须首先得理解什么是什么是UDP?这里简单概括一下. UD

【转】 linux编程之GDB调试

GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显示出来 3 单步执行 4 运行时修改变量的值 5 跟踪路径 6 线程切换 等等 下面以以下程序为例 当我们要使用GDB进行程序的调试时,在用GCC编译时需要加上-g,如下: GDB之所以能够进行程序的调试也是在于进行编译时的-g选项,当设置了这个选项的时候,GCC会向程序中塞入一下信息,作为GDB调

我的linux编程之路01

我的linux编程之路从现在开始!

Linux编程之PING的实现

void icmp_pack(struct icmp* icmphdr, int seq, int length) { int i = 0; icmphdr->icmp_type = ICMP_ECHO; //类型填回送请求 icmphdr->icmp_code = 0; icmphdr->icmp_cksum = 0; //注意,这里先填写0,很重要! icmphdr->icmp_seq = seq; //这里的序列号我们填1,2,3,4.... icmphdr->icmp

linux编程之awk

gawk是由GNU组织改良后的awk,这种语言在linux操作系统上,有着很好的应用,它不需要编译,比其它语言更为简洁,而且效率极高,还能与shell进行交互,是运维人员必不可少的编辑三剑客之一 gawk是一种报告生成器,它将文本读入内存,然后,结符合的显示在屏幕上 gawk的基本语法: gawk [options] 'program' file file - gawk [options] 'PATTERN{action}'file file- 1.gawk的输出,使用print和printf

linux编程之getopt

getopt -- 解析命令的可选项 [说明]getopt只是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,格式如下: 1.形如:cmd [-a][-b] //对短选项的解析: 2.形如:cmd [-a a_argument][-b b_argument] //对短选项及短选项的参数解析: 3.形如:cmd [-a[a_argument]] //选项a的参数也是可选的情况解析 原型: #include <unistd.h> extern char *optarg; extern

Linux编程之recvmsg和sendmsg函数

recvmsg 和 sendmsg 函数 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_

Linux编程之Epoll高并发

网络上所有资料都说epoll是高并发.单线程.IO重叠服用的首选架构,比select和poll性能都要好,特别是在有大量不活跃连接的情况下.具体原理就不阐述了,下面说说使用. 具有有三个函数: #include <sys/epoll.h> 1.int epoll_create ( int size ); size是epoll要监视的fd的规模. 2.int epoll_ctl ( int epfd, int op, int fd, struct epoll_event *event ); (1