【问题标题】:makefile include static library - Cmakefile 包含静态库 - C
【发布时间】:2015-07-17 10:35:14
【问题描述】:

我有 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. 矩阵.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

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

制作

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

使用时出现同样的错误

制作codebarre.o

我认为我没有正确使用我的库。但我不知道该怎么做。

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

【问题讨论】:

  • 你能告诉我们make的完整输出,而不仅仅是错误信息吗?
  • 你知道双引号会让预处理器查看当前目录吗?也许您打算使用尖括号并将-Ipath/to/include/directory 添加到CFLAGS
  • 错误信息是make的唯一输出。

标签: c gcc makefile static-libraries


【解决方案1】:

您的第二个项目在当前工作目录中没有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) $^

【讨论】:

  • 我将 PNM.h 文件放在我的第二个项目的目录中。它运作良好。但是可以只放 libpnm.a 吗?我试过 -I./libpnm 但它不起作用。我查看了 libpnm.a,我只能看到 PNM.o 我应该在其中添加 PNM.h 吗?
  • @Adrien 不,库只包含目标文件。您应该了解,头文件向库的函数声明了一个接口,并且必须可供编译器在编译时找到。编译器或链接器将在库中查找头文件,它只会查找默认位置和-I 指定的位置。
猜你喜欢
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2019-07-11
  • 2018-01-17
相关资源
最近更新 更多