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

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

这些通常是链接器命令行的一部分,可以直接在目标操作中提供,也可以更通用地分配给将要展开的链接命令的makevariables。 在这种情况下:

-L是包含这些库的目录的path。 图书馆的searchpath。

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

例如,如果你想链接到库~/libs/libabc.a你可以添加:

 -L$(HOME)/libs -labc 

为了利用链接的默认隐式规则,将这些标志添加到variablesLDFLAGS ,如下所示

 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: ao bo co $(CC) $(LDFLAGS) $^ $(LIBS) -o $@ # or if you really want to call ld directly, # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@ 

即使它可能工作,否则-l...指令应该追溯到引用这些符号的对象之后 。 如果以错误的顺序进行链接-Wl,--as-needed某些优化( -Wl,--as-needed是最明显的)将会失败。

为了真正理解makefile,你还需要对项目工具链中所有组件的命令行有一个很好的理解。 像-I-L这样的选项不能被make自己理解。 相反,make会尝试创build一个命令行,该命令行将执行一个工具来将必备文件转换为目标文件。

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

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

从通用的angular度来说,这些特定的选项在编译器和链接器中是相当标准的。 -I将一个目录添加到由编译器search的位置列表中,用于在#include行中命名的文件, -L将目录添加到由链接程序search的位置列表中,该目录是用-l选项命名的库。

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

有一点要注意的是,这些是传递给编译器/链接器的选项。 所以你应该看看编译器的手册页/文档来了解他们的angular色。