makefile 中的 -I 和 -L 有啥区别?

Posted

技术标签:

【中文标题】makefile 中的 -I 和 -L 有啥区别?【英文标题】:What is the difference between -I and -L in makefile?makefile 中的 -I 和 -L 有什么区别? 【发布时间】:2010-10-05 21:10:52 【问题描述】:

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

【问题讨论】:

Jinx,您是在询问 $LDFLAGS 中的选项还是作为 make 的开关,就像这里一样?使-l @Nathan..前者,但选项是大写“i”而不是“l”。 【参考方案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 是最明显的)将会失败。

【讨论】:

gnu.org/software/make/manual/html_node/Implicit-Variables.html: > LDFLAGS 在编译器应该调用链接器时提供额外的标志,'ld',例如 -L。应将库 (-lfoo) 添加到 LDLIBS 变量中。 > LDLIBS 库标志或在编译器应该调用链接器时提供的名称,“ld”。 LOADLIBES 是 LDLIBS 的已弃用(但仍受支持)替代方案。非库链接器标志,例如 -L,应该放在 LDFLAGS 变量中。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

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

【讨论】:

我还是不知道最有效的表示-I标志的方式是什么? -L 可以翻译成 LDFLAGS。

以上是关于makefile 中的 -I 和 -L 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Makefile 中的 $(objs): %.o : %.cpp 和 $(objs): $(objs:.o=.cpp) 有啥区别

makefile 和 sh 文件有啥区别

GNU Makefile 变量赋值 =、?=、:= 和 += 有啥区别?

android.mk makefile 有啥区别

我的编译行和我的 makefile 之间有啥区别可能导致错误?

linux的makefile中":="与"?="有啥区别