makefile中-I和-L有什么区别?

时间:2009-02-06 06:43:30

标签: linux makefile linker ld

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

3 个答案:

答案 0 :(得分:88)

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

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

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

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

-L$(HOME)/libs -labc

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

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

LDFLAGSLIBS分开是个好习惯,例如

# 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是最明显的)将会失败。

答案 1 :(得分:25)

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

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

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

所有这些在通用术语中都表示,这些特定选项在编译器和链接器中非常标准。 -I将一个目录添加到编译器为#include行上命名的文件搜索的位置列表,-L将目录添加到链接器搜索的位置列表中以-l选项命名的库。

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

答案 2 :(得分:1)

需要注意的是,这些是传递给编译器/链接器的选项。 因此,您应该查看编译器手册页/文档以了解其角色。