【问题标题】:how to use makefile to include .a static library and .h file from another directory in C?如何使用makefile在C中包含来自另一个目录的.a静态库和.h文件?
【发布时间】:2013-10-13 02:58:52
【问题描述】:

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

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

我应该在 Makefile(也位于/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

任何帮助将不胜感激,在此先感谢!

【问题讨论】:

    标签: c++ c makefile


    【解决方案1】:

    从非标准目录中包含头文件和库很简单。

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

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

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

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

    如果您不明确运行 GCC,它将自动使用 CFLAGSLDFLAGS

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

    LDFLAGS += -static -lmylib
    

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

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

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

    【讨论】:

    • 谢谢!但是呃...如果我的头文件和库在同一个目录中,而 .c 文件在另一个目录中怎么办?我应该做同样的事情吗?同时,我是否必须在我的 .c 文件中写入 #include "myheader.h" ?谢谢!
    • 可能必须添加-I.-L.,但过程都是一样的。但是mainmain.o 的两条规则都可以安全地离开gcc 行,它会做正确的事情。另外,是的,您确实需要在您的 .c 文件中包含适当的 #include 指令。
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2014-03-17
    • 1970-01-01
    • 2021-12-17
    • 2015-10-08
    相关资源
    最近更新 更多