64

makefile 中 -I 和 -L 标志的用途是什么?

4

3 回答 3

98

这些通常是链接器命令行的一部分,或者直接在目标操作中提供,或者更常见地分配给make将扩展为形成链接命令的变量。在这种情况下:

-L是包含库的目录的路径。库的搜索路径。

-l是您要链接到的库的名称。

例如,如果您想链接到~/libs/libabc.a您要添加的库:

-L$(HOME)/libs -labc

要利用默认的隐式链接规则,请将这些标志添加到变量LDFLAGS中,如

LDFLAGS+=-L$(HOME)/libs -labc

LDFLAGS将和分开是一个好习惯LIBS,例如

# LDFLAGS contains flags passed to the compiler for use during linking
LDFLAGS = -Wl,--hash-style=both
# LIBS contains libraries to link with
LIBS = -L$(HOME)/libs -labc
program: a.o b.o c.o
        $(CC) $(LDFLAGS) $^ $(LIBS) -o $@
        # or if you really want to call ld directly,
        # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@

即使它可能以其他方式工作,-l...指令也应该遵循引用这些符号的对象如果链接以错误的顺序完成,一些优化(-Wl,--as-needed最明显的)将失败。

于 2009-02-06T06:50:27.877 回答
32

要真正了解 makefile,您还需要对项目工具链的所有组件的命令行有很好的理解。make 本身不理解类似-I和的选项。-L相反,make 正在尝试创建一个命令行,该命令行将执行一个工具来将先决条件文件转换为目标文件。

通常,这是将 C 或 C++ 源文件编译为目标文件,并最终链接以获取可执行文件。

在这种情况下,您需要查看编译器的手册,尤其是与它所理解的命令行选项相关的部分。

笼统地说,这些特定选项在编译器和链接器中是相当标准的。-I将目录添加到编译器搜索的位置列表中以查找在#include一行中命名的文件,-L并将目录添加到链接器搜索的位置列表中以查找以该-l选项命名的库。

最重要的是,makefile 的“语言”是 makefile 本身的语法、已知的 shell(通常/bin/sh或类似的东西)、常见的 shell 命令(如rmcpinstall等)和特定于您的编译器和链接器的命令(例如gcc -v --help,在您的 shell 提示符下键入将为您提供 gcc 理解的几乎完整(并且非常长)的选项列表作为一个起点)。

于 2009-02-20T08:03:11.827 回答
2

需要注意的一件事是,这些是传递给编译器/链接器的选项。因此,您应该查看编译器手册页/文档以了解它们的作用。

于 2009-02-06T13:15:31.890 回答