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

What is the difference between -I and -L in makefile?

提问人:MainID 提问时间:2/6/2009 最后编辑:TylerHMainID 更新时间:10/27/2017 访问量:68962

问:

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

Linux 生成文件 链接器 ld

评论

0赞 Nathan Fellman 2/6/2009
金克斯,你是在问$LDFLAGS中的选项,还是作为制造的开关,就像这个一样?make -l
0赞 MainID 2/6/2009
@Nathan..前者,但选项是大写的“i”而不是“l”。

答:

104赞 Nathan Fellman 2/6/2009 #1

它们通常是链接器命令行的一部分,要么直接在目标操作中提供,要么更常分配给将扩展为形成链接命令的变量。在这种情况下: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赞 南山竹 8/15/2017
gnu.org/software/make/manual/html_node/Implicit-Variables.html:> LDFLAGS 当编译器应该调用链接器“ld”时,要提供给编译器的额外标志,例如 -L。> LDLIBS 库标志或名称,当编译器应该调用链接器“ld”时,它们会被赋予编译器。LOADLIBES 是 LDLIBS 的弃用(但仍受支持)替代方案。非库链接器标志(如 -L)应放在 LDFLAGS 变量中。
2赞 sateesh 2/6/2009 #2

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

36赞 RBerteig 2/20/2009 #3

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

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

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

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

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

评论

0赞 Edmon 8/11/2017
我仍然不知道表示-I标志的最有效方法是什么?-L 可以转换为 LDFLAGS。