【问题标题】:Makefile issue in C LINUXC LINUX 中的 Makefile 问题
【发布时间】:2020-10-02 20:36:26
【问题描述】:

我的文件夹中有以下文件:

main.c |文件 1.c |文件1.h |文件2.c |文件2.h

main.c 依赖于 file1.h 和 file2.h。 但是file1.c也依赖于file2.h,这是我的问题。

这是我所拥有的:

CC = gcc
CFLAGS = -Wall -g

BIN = main


all: $(BIN)


main: main.o file1.o file2.o
    $(CC) -o $@ $^

main.o: main.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

file1.o: file1.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

file2.o: file1.c file1.h
    $(CC) $(CFLAGS) -c -o $@ $<

clean:
    rm -f *.o $(BIN)

显然这是行不通的。

我可以做些什么来使我的 makefile 工作?并改进它?

编辑:

在 main.c 中:

#include "file1.h"

在file1.c中:

#include "file1.h"

在文件 1.h 中:

#include "file2.h"

在file2.c中:

#include "file2.h"

我在 file2.h 中没有包含。

我这样做对吗?

【问题讨论】:

  • 这就是为什么我使用automake 并且不用担心这类事情。
  • 如果“main.c 依赖于 file1.h 和 file2.h”,那么 main.o: main.c 应该是 main.o: main.c file1.h file2.h。 (注意是main.o,而不是main.c,它依赖于file1.h和file2.h。除非main.c的contents必须在file1.h或file2.h改变时改变.) 除此之外,你为什么说“这显然行不通”?

标签: c linux makefile dependencies


【解决方案1】:

只需添加 file2.h 作为 file1.o 的依赖项

它应该可以工作。

【讨论】:

  • 是的,就是这样。谢谢。
【解决方案2】:

我建议使用make 的通配符匹配。为了演示,我在文件中填充了一些简单的函数。

file2.h

void func2(void);

file2.c

#include "file2.h"

void func2()
{
        return;
}

file1.h

#include "file2.h"

void func1();

file1.c

#include "file1.h"

void func1()
{
        func2();
        return;
}

main.c

#include "file1.h"

int main()
{
        func1();
        return 0;
}

现在,您可以使用make 的通配符匹配,例如*.o : *.c,从任何.c 文件生成.o 文件。

生成文件

CC = gcc
CFLAGS = -Wall -g
OBJS = main.o file1.o file2.o
BIN = main

all : $(BIN)

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)

终端会话

$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile
$ make 
gcc -Wall -g   -c -o main.o main.c
gcc -Wall -g   -c -o file1.o file1.c
gcc -Wall -g   -c -o file2.o file2.c
gcc -Wall -g -o main main.o file1.o file2.o
$ ./main
$ make clean 
rm -f *.o main
$ ls 
file1.c  file1.h  file2.c  file2.h  main.c  Makefile

一般情况下,建议单独保留.h 文件,例如,具有includes 目录。通过该修改,Makefile 变为

生成文件

CC = gcc
CFLAGS = -Wall -g -I./includes
OBJS = main.o file1.o file2.o

main: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

*.o : *.c
        $(CC) $(CFLAGS) -c -o $@ $^
clean:
        rm -f *.o $(BIN)

终端会话

$ ls 
file1.c  file2.c  includes  main.c  Makefile
$ ls includes/
file1.h  file2.h
$ make 
gcc -Wall -g -I./includes   -c -o main.o main.c
gcc -Wall -g -I./includes   -c -o file1.o file1.c
gcc -Wall -g -I./includes   -c -o file2.o file2.c
gcc -Wall -g -I./includes -o main main.o file1.o file2.o
$ ./main 
$ make clean 
rm -f *.o main
$ ls
file1.c  file2.c  includes  main.c  Makefile

【讨论】:

  • 这很有帮助。感谢您的宝贵时间。
  • @Alcachofra 由于您是社区的新手,请刷新此链接,someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多