1. 程式人生 > 其它 >Makefile 練習(二):多個原始檔

Makefile 練習(二):多個原始檔

技術標籤:Linux 基礎linuxmakefileubuntu

1 位於同一目錄下

在這裡插入圖片描述

list1.c

#include "list1.h"
#include <stdio.h>

void list1_printf()
{
	printf("this is printf from list1\r\n");
}

list2.c

#include "list2.h"
#include <stdio.h>

void list2_printf()
{
	printf("this is printf from list2\r\n"
); }

main.c

#include "list1.h"
#include "list2.h"
#include <stdio.h>

int main()
{
	
	printf("this is printf from main\r\n");

	list1_printf();
	list2_printf();
 
	return 0;
}

list1.h

#ifndef __LIST1__
#define __LIST1__

void list1_printf();

#endif

list2.h

#ifndef
__LIST2__
#define __LIST2__ void list2_printf(); #endif

Makefile

CC := gcc
TAR := main
OBJ := main.o list1.o list2.o

$(TAR):$(OBJ)
	$(CC) -o [email protected] $^
main.o:main.c list1.h list2.h
	$(CC) -c $<
list1.o:list1.c list1.h
	$(CC) -c $<
list2.o:list2.c list2.h
	$(CC) -c $<

.PHONY:
clean clean: rm -f $(OBJ) $(TAR)

這部分增加了自動化變數[email protected] $^ $<的練習

[email protected]:所有的目標檔案,這裡僅指代 main
$^: 所有的依賴檔案,這裡指代 main.o list1.o list2.o, 即 $(OBJ) 定義的內容
$<:依賴檔案中的第一個,分別指代 list1.c 和 list2.c

2 位於不同目錄下

在這裡插入圖片描述
inc 下包含 list1.h 和 list2.h
src 下包含 list1.c list2.c 和 main.c

Makefile 如下

PATH_SEL = y

ifneq ($(PATH_SEL),)
vpath %.c src
vpath %.h inc
else
VPATH = src inc
endif

OBJ = main.o list1.o list2.o

main:$(OBJ)
	gcc -o [email protected] $(OBJ)
main.o:main.c list1.h list2.h
	gcc -c $< -Iinc
list1.o:list1.c list1.h
	gcc -c $< -Iinc
list2.o:list2.c list2.h
	gcc -c $< -Iinc

.PHONY:clean
clean:
	rm -f *.o main

這部分練習了檔案搜尋變數 VPATH 和 vpath

2.1 問題記錄

除錯過程中遇到的問題有
(1) 當指令中缺少 -Iinc 路徑時,報錯提示找不到 list1.h 和 list2.h
因此,不光要用VPATH或vpath指定搜尋路徑,還要再命令中新增標頭檔案依賴的路徑

main.o:main.c list1.h list2.h
	gcc -c $< 

在這裡插入圖片描述
(2) 未使用 $< 自動化變數時,報錯提示找不到 main.c

main.o:main.c list1.h list2.h
	gcc -c main.c -Iinc

在這裡插入圖片描述