Makefile 練習(二):多個原始檔
阿新 • • 發佈:2021-02-02
技術標籤: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