C Makefile - 仅重新编译已更改的文件

时间:2017-03-18 17:37:42

标签: makefile

您好我有一个链接到主文件的共享库libnsd.so(由nsd.c,nsd.h,nd.c,nd.h组成)。 我的问题是如何编写makefile,以便它只重新编译那些已经更改的源文件。 我已经阅读了一些关于此的主题,但有些困惑,我是一名初学程序员。 到目前为止我的makefile代码:

CC=gcc

all : lib alll

alll : main.c   
    $(CC) main.c -o main -L. libnsd.so

lib : nsd.c nsd.h nd.c nd.h
    $(CC) -c -fPIC nsd.c -o nsd.o
    $(CC) -c -fPIC nd.c -o nd.o
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so  nsd.o nd.o

clean:
    rm main libnsd.so nd.o nsd.o

1 个答案:

答案 0 :(得分:1)

Makefile具有构建目标的概念。构建目标实际上是所有中间文件和最终文件,并且按照它们的编写方式,可以使它们使用依赖项。

makefile的示例解决方案:

CC=gcc

all: main

main: main.c libnsd.so
    $(CC) main.c -o main -L. libnsd.so

libnsd.so: nsd.o nd.o
    $(CC) -shared -Wl,-soname,libnsd.so -o libnsd.so $@

%.o: %.c nsd.h nd.h
    $(CC) -c -fPIC $< -o $@

有几点需要注意:

  1. 你应该正确地纠正我对目标文件创建的依赖性(因为我认为每个C文件都取决于两个标题)。
  2. 您可能希望注意我使用过的通配符......
  3. 如果这些命令中没有任何特殊内容,我可以让默认命令工作。请注意,我已使用$<作为第一个依赖项,并使用$@作为通配符规则中的输出。
  4. 我还没有复制clean规则,因为它在问题本身中写得正确。
  5. 每个目标(除了&#34; phony&#34;目标all)创建一个具有相同名称的文件:目标libnsd.so创建一个名为{{1}的文件}。目标libnsd.so会创建一个名为main的文件。

    当目标的依赖关系更改日期以使依赖关系比输出更新时,main将重新创建目标,以及依赖于它的其他目标。但是如果你有一个未映射到任何输出文件的目标,那么总是调用该目标(在我们的代码中,总是调用make目标,但幸运的是它没有命令,它只依赖于可能的实际文件。或者可能不需要重新创建)

    请注意,GNU Make并不需要特别编译。输出文件的创建可以通过任何方式实现,实际上我已经看到目标创建了一个all存档。但是,如果该存档比任何依赖项(它将打包的文件夹)旧,那么根据.cpio.gz,它将被重新创建。