makefile 包含静态库 - C

makefile include static library - C

我有 2 个项目。
第一个有 4 个文件:
1. main.c(其中包括PNM.h)
2. PNM.c(其中包括PNM.h)
3. PNM.h
4. 生成文件

CC=gcc
LD=gcc
CFLAGS=--std=c99 -Wall -W -Wmissing-prototypes
LDFLAGS=
DOXYGEN=doxygen
RM=rm

AR=ar
RANLIB=ranlib

all: pnm

lib: PNM.o
    @$(AR) ru libpnm.a PNM.o
    @$(RANLIB) libpnm.a

pnm: main.o PNM.o
    @$(LD) -o $@ $^ $(LDFLAGS)

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

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

clean:
    @$(RM) -rf *.o

allclean: clean
    @$(RM) -rf pnm
    @$(RM) -rf libpnm.a

这个项目运行完美。

在我的第二个项目中,我有 6 个文件和 libpnm.a:
1. libpnm.a
2. main.c(包括matricules.h)
3. matricules.c(包括matricules.h和codebarre.h)
4.matricules.h
5. codebarre.c(包括codebarre.h和PNM.h)
6.codebarre.h
7. 生成文件

CC=gcc
LD=gcc
CFLAGS=--std=c99 -Wall -W -Wmissing-prototypes
LDFLAGS=
DOXYGEN=doxygen
RM=rm

all: codebarre

codebarre: main.o matricules.o codebarre.o libpnm.a
    @$(LD) -o $@ $^ $(LDFLAGS)

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

matricules.o: matricules.c matricules.h codebarre.h
    @$(CC) -o $@ -c matricules.c $(CFLAGS)

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

clean:
    @$(RM) -rf *.o

allclean: clean
    @$(RM) -rf codebarre

(每个项目都在一个单独的文件夹中)
当我使用

make

我得到一个错误:
codebarre.c:6:17: 致命错误: PNM.h: 没有那个文件或目录
#include "PNM.h"
^
编译终止。

我使用

时出现同样的错误

make codebarre.o

我想我没有正确使用我的图书馆。但我不知道该怎么做。

编辑:在目录中添加了 PNM.h -> 运行良好

您的第二个项目在当前工作目录中没有 PNM.h 文件(根据您的列表)。然后编译器编译的时候找不到codebarre.c.

您也需要复制 PNM.h,或者告诉编译器使用 -I 选项在 PNM.h 所在的目录中查找包含文件,例如与

codebarre.o: codebarre.c codebarre.h libpnm.a
    @$(CC) -o $@ -Isomedirectory -c codebarre.c $(CFLAGS)

请注意,将 libpnm.a 命名为目标文件的依赖项是 错误的 。该库应该是最终可执行文件的依赖项,例如

codebarre: main.o matricules.o codebarre.o libpnm.a
    @$(LD) -o $@ $(LDFLAGS) $^