您好我有一个链接到主文件的共享库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
答案 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 $@
有几点需要注意:
$<
作为第一个依赖项,并使用$@
作为通配符规则中的输出。clean
规则,因为它在问题本身中写得正确。每个目标(除了&#34; phony&#34;目标all
)创建一个具有相同名称的文件:目标libnsd.so
创建一个名为{{1}的文件}。目标libnsd.so
会创建一个名为main
的文件。
当目标的依赖关系更改日期以使依赖关系比输出更新时,main
将重新创建目标,以及依赖于它的其他目标。但是如果你有一个未映射到任何输出文件的目标,那么总是调用该目标(在我们的代码中,总是调用make
目标,但幸运的是它没有命令,它只依赖于可能的实际文件。或者可能不需要重新创建)
请注意,GNU Make并不需要特别编译。输出文件的创建可以通过任何方式实现,实际上我已经看到目标创建了一个all
存档。但是,如果该存档比任何依赖项(它将打包的文件夹)旧,那么根据.cpio.gz
,它将被重新创建。