【Linux】编写 Makefile

目录

1. 适配多文件多目录

2. 适配单个文件(C)

3. 适配单个文件(C++)


1. 适配多文件多目录

####################################################
#####Copyright (c) 2019, code farmer from sust.#####
###############All rights reserved.#################

.PHONY: clean install

# multi file
INC = ./include
SRC = ./src
OBJ = ./obj
BIN = ./bin
BIN_TARGET = $(BIN)/test

CC = gcc 
CFLAGS = -g -Wall -I$(INC)

# match *.c
SOURCE = $(wildcard $(SRC)/*.c)
# replace *.o with *.c
OBJECT = $(patsubst %.c, $(OBJ)/%.o, $(notdir $(SOURCE)))

$(BIN_TARGET):$(OBJECT)
    $(CC) $(CFLAGS) $(OBJECT) -o $@

$(OBJ)/%.o:$(SRC)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

# echo debug info
echo:
    @echo $(CC)
    @echo $(SRC)
    @echo $(INC)
    @echo $(OBJ)
    @echo $(BIN)

install:
    install -m 755 $(BIN) /usr/local/bin

clean:
    -rm -rf $(OBJECT) $(BIN_TARGET)

2. 适配单个文件(C)

####################################################
#####Copyright (c) 2019, code farmer from sust.#####
###############All rights reserved.#################

.PHONY: clean install ALL

CC = gcc 
#CFLAGS = -g -Wall -fno-stack-protector
CFLAGS = -g -Wall -DDEBUG

# match *.c
SOURCE = $(wildcard ./*.c)
# replace * with *.c
#BIN = $(patsubst %.c, %, $(notdir $(SOURCE)))
BIN = $(basename $(SOURCE))

ALL: $(BIN)
%: %.c
    $(CC) $(CFLAGS) $< -o $@

# echo debug info
echo:
    @echo $(CC)
    @echo $(SOURCE)
    @echo $(BIN)

install:
    install -m 755 $(BIN) /usr/local/bin

clean:
    -rm -rf $(BIN)

3. 适配单个文件(C++)

####################################################
#####Copyright (c) 2019, code farmer from sust.#####
###############All rights reserved.#################

.PHONY: clean install ALL

CC = g++
CFLAGS = -g -Wall -std=c++11
#CFLAGS = -g -Wall -Wno-int-to-pointer-cast -Wpointer-to-int-cast -fno-stack-protector
# for std::thread
#THREAD_FLAGS = -Wl,--no-as-needed -pthread

# match *.c*
SOURCE = $(wildcard ./*.c*)
BIN = $(basename $(SOURCE))

ALL: $(BIN)
%: %.c*
    $(CC) $(CFLAGS) $(THREAD_FLAGS) $< -o $@

# echo debug info
echo:
    @echo $(CC)
    @echo $(SOURCE)
    @echo $(SUFFIX)
    @echo $(BIN)

install:
    install -m 755 $(BIN) /usr/local/bin

clean:
    -rm -rf $(BIN)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Makefile文件是用于自动化编译和链接程序的文件,它可以根据源代码的变化自动更新目标文件和可执行文件。在Linux系统中,Makefile文件通常使用GNU Make工具来执行。 编写Makefile文件的基本步骤如下: 1. 定义变量:在Makefile文件中,可以定义变量来存储一些常用的参数和路径,例如编译器、编译选项、源代码路径等。 2. 定义目标:Makefile文件中的目标是指需要生成的文件或执行的操作,例如可执行文件、目标文件、清理操作等。 3. 定义规则:Makefile文件中的规则是指如何生成目标文件或执行操作的步骤,包括依赖关系、命令等。 4. 编写命令:Makefile文件中的命令是指生成目标文件或执行操作的具体命令,例如编译、链接、清理等。 5. 执行Makefile:在Linux系统中,可以使用make命令来执行Makefile文件,它会根据Makefile文件中定义的规则和命令来自动化编译和链接程序。 总之,编写Makefile文件需要熟悉Makefile语法和Linux系统的编译和链接过程,可以根据具体的项目需求和编译环境来进行调整和优化。 ### 回答2: 在Linux操作系统中,makefile是一种非常重要的文件,它可以帮助开发者自动化地控制代码编译、链接和打包等工作流程。 在编写makefile文件之前,首先需要了解两个重要的概念:目标和依赖。 目标指的是需要生成的文件或者需要执行的命令,而依赖则是指生成目标文件所需要的源文件或其他目标文件。 一个基本的makefile文件包含三部分:变量定义、依赖关系和规则。 变量可以定义一些常用的参数,例如编译器和标志等,以便于在整个makefile文件中引用和修改。变量的定义方式为VAR=value。 依赖关系是指目标文件与源文件或其他目标文件之间的关系,例如: main.o : main.c gcc -c main.c 规则则是指如何生成目标文件,例如: main : main.o gcc -o main main.o 其中,main.o是依赖文件,main是目标文件。在这个规则中,我们指定了将main.o与其他一些目标文件一起编译成可执行文件main的方式。 除了基本的变量定义、依赖关系和规则之外,makefile文件还可以使用条件语句、循环语句等高级语法,以实现更加灵活的操作。 总之,编写makefile文件需要仔细考虑编译和链接的顺序及依赖关系,同时也需要掌握一些高级语法,以实现更加完善和自动化的开发流程。 ### 回答3: Makefile是在linux操作系统下编写的一种用于控制程序编译、链接和安装的文件格式。它是一种文本文件,使用一些特定的语法规则,可以让程序编译时自动根据需要进行编译,并且可以自动完成目标文件的链接和安装。 Makefile的基本格式可以分为四个部分:变量定义、依赖关系、命令和注释。 变量定义是Makefile中非常重要的一个部分,它可以用来定义一些常用的路径、编译选项、库链接等参数,方便后续使用。例如: CC = gcc CFLAGS = -O2 -Wall LIBS = -lm 其中CC表示编译器,CFLAGS表示编译选项,LIBS表示需要链接的库。 依赖关系是指一个目标文件所依赖的源文件或其他目标文件。在Makefile中,可以用类似于下面的语法来表示: target: dependencies command 例如: main.o: main.c $(CC) $(CFLAGS) -c main.c -o main.o 这里表示main.o这个目标文件依赖于main.c这个源文件,由$(CC) $(CFLAGS) -c main.c -o main.o这个命令来生成main.o。 命令是具体的编译、链接或安装命令,它们必须以一个制表符开头。例如: main: main.o $(CC) $(CFLAGS) main.o -o main $(LIBS) 这里表示生成可执行文件main的命令是将main.o及$(LIBS)链接成为一个可执行文件。 注释是Makefile中的注释,与C语言相同,可以用//或者#来表示。 Makefile编写需要遵循一些基本原则:避免硬编码、严格使用变量、充分利用自动化机制等。这样不仅可以方便后续的维护和修改,而且可以更好地发挥Makefile的自动化功能,提高开发效率。 总之,MakefileLinux环境下程序编译和安装的重要工具,它可以自动化地完成编译、链接和安装等繁琐的工作,提高了开发效率。 Makefile编写需要根据具体的项目需求和代码结构进行有针对性的设计和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值