【问题标题】:Makefile with multiple directories具有多个目录的 Makefile
【发布时间】:2012-03-16 08:25:59
【问题描述】:

我想为一个源文件位于不同目录的程序编写一个makefile,结构是:

--root(here will be makefile)    
  --src:
    --main.c
    --include:
      --here are 6 .h files, that are used by other .c files, main.c includes on all of them
    --operacje
      --suma.c
      --iloczyn.c
      --roznica.c
    --reszta:
      macierz.c
    --we_wy:
      --rest of the .c files

大多数 .c 文件至少包含一个 .h 文件。这是我到目前为止写的:

VPATH=./src:./src/include:./src/operacje:./src/reszta:./src/we_wy
CLFAGS = -Wall
CC = gcc
INCLUDE = -I src/include
NAME = macierze

FILE_SOURCE := pliki.c wczytaj_plik.c wypisz_plik.c
CONSOLE_SOURCE := wczytaj_konsola.c wypisz_konsola.c
OTHER_SOURCE := suma.c roznica.c iloczyn.c macierz.c
HEADERS := suma.h roznica.h iloczyn.h wypisz.h wczytaj.h macierz.h

FILE_OBJECTS := $(FILE_SOURCE:.c=.o)
CONSOLE_OBJECTS := $(CONSOLE_SOURCE:.c=.o)
OTHER_OBJECTS := $(OTHER_SOURCE:.c=.h)

%.o: %.c %.h
    gcc $(CFLAGS) $(INCLUDE) -c $?

%.o: %.c
    gcc $(CFLAGS) $(INCLUDE) -c $? -o $@


finput: HEADERS+=pliki.h

finput: $(FILE_OBJECTS) $(OTHER_OBJECTS) main.o
    gcc $(CFLAGS) -o $(NAME) $^ -D WEWY_PLIKI 

main.o: main.c $(HEADERS)
    gcc $(CFLAGS) $(INCLUDE) -c src/main.c

clean: 
    rm -rf *.o

我们的目标是,让编译后的程序在 make 的基础上运行有点不同,因此添加了 -D 选项并添加了

finput: HEADERS+=pliki.h

这个 finput 是 4 个可能选项中的第一个。每个选项将使用略有不同的 .c 和 .h 文件集

现在,当我这样做时

make finput

我得到了列表:

gcc  -I src/include -c ./src/we_wy/pliki.c ./src/include/pliki.h
gcc  -I src/include -c ./src/we_wy/wczytaj_plik.c -o wczytaj_plik.o
gcc  -I src/include -c ./src/we_wy/wypisz_plik.c -o wypisz_plik.o
gcc  -I src/include -c src/main.c
gcc  -o macierze pliki.o wczytaj_plik.o wypisz_plik.o ./src/include/suma.h ./src/include/roznica.h ./src/include/iloczyn.h ./src/include/macierz.h main.o -D WEWY_PLIKI 
wczytaj_plik.o: In function `wczytaj':
wczytaj_plik.c:(.text+0x5f): undefined reference to `macierz_alokuj'
main.o: In function `main':
main.c:(.text+0x7e): undefined reference to `suma'
<and other undefined references in main>

我注意到一些错误: 1. 它不会从 $(OTHER_OBJECTS) 生成 .o 文件 2. $(CFLAGS) 中没有 -Wall 选项 3. 当然它没有完成。

我会很感激一些信息,我做错了什么。

【问题讨论】:

    标签: gcc linker makefile


    【解决方案1】:

    OTHER_OBJECTS := $(OTHER_SOURCE:.c=.h)

    如果这不是拼写错误,那就是 (1.) 的解释。您将文件重命名为头文件,并且头文件在 VPATH 中找到并且没有重新制作规则,因此它们被逐字包含在 $^ 中。试试$(OTHER_SOURCE:.c=.o)

    CLFAGS = -墙

    改用CFLAGS

    【讨论】:

    • 现在我觉得很傻,一切正常,只有 2 个错别字...,无论如何,非常感谢您的帮助。
    • 我还有一个问题,我修复了 make-file 但每次我调用 make finput 它总是至少链接 .o 文件(finput 规则),即使我没有做任何更改文件,为什么?
    • 没有finput 文件,只有macierze 文件。但是,目标部分显示 finput,因此 make 查找 finput 并没有找到它。在任何地方将finput 替换为$(NAME)
    【解决方案2】:

    只是指出这一点:

    finput: HEADERS+=pliki.h
      ...
    main.o: main.c $(HEADERS)
    

    不会做你想做的事。特定于目标的变量仅在子目标的配方有效。它们对先决条件列表没有任何影响(例如)。

    我敦促您研究自动生成 make 依赖项的方法:这比尝试在 makefile 中手动维护它们更有效(也更准确)。

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多