如何使用 makefile 包含 C 中另一个目录中的 .a 静态库和 .h 文件

how to use makefile to include .a static library and .h file from another directory in C?

本文关键字:静态 文件 makefile 何使用 包含 另一个      更新时间:2023-10-16

我创建了一个.h头文件,实现并创建了静态库文件.a,它们都在目录中,例如/home/data/folder1

我还有另一个.c文件,它将使用链接.h头文件和.a库文件。但是,.c文件位于目录 /home/data/folder2 中。

我应该在生成文件(也位于/home/data/folder2(中写什么?另外,我是否应该在要编译的.c文件中包含myheader.h?这是我到目前为止所拥有的,但不起作用:

LIBB = -L/home/data/folder1/libmylib.a
HEADER = -L/home/data/folder2/myheader.h
main: main.o
    gcc $(HEADER) $(LIBB) $< -o $@
main.o: main.c
    gcc -c main.c
.PHONY: clean
clean:
    rm -f *.o *.~ a.out main

任何帮助将不胜感激,提前感谢!

包含来自非标准目录的头文件和库很简单。

你有包含库的目录和包含头文件的目录的路径,所以我们将它们存储在变量中:

LIBB = /home/data/folder1
LIBINCLUDE = /home/data/folder2

现在 GCC 需要知道在哪里查找标头,因此我们只需将其包含在 CFLAGS 中。链接器(不是编译器(需要知道在哪里查找库,因此我们可以将其添加到LDFLAGS

CFLAGS += -I$(LIBINCLUDE)
LDFLAGS += -L$(LIBB)

如果您未显式运行 GCC,它将使用该CFLAGS并自动LDFLAGS

但是对于链接步骤,它需要知道需要库,因此:

LDFLAGS += -static -lmylib

链接器将在 LDFLAGS 中由-L选项命名的所有目录中查找libmylib.a

由于您的mainmain.o规则是明确的,因此请像这样更改它们(但请务必使用制表符,而不是 4 个空格(:

main: main.o
    gcc $(LDFLAGS) $< -o $@
main.o: main.c
    gcc $(CFLAGS) $< -o $@