makefile中的-I和-L有什么区别?
makefile中-I和-L标志的用法是什么?
这些通常是链接器命令行的一部分,可以直接在目标操作中提供,也可以更通用地分配给将要展开的链接命令的make
variables。 在这种情况下:
-L
是包含这些库的目录的path。 图书馆的searchpath。
-l
是要链接到的库的名称。
例如,如果你想链接到库~/libs/libabc.a
你可以添加:
-L$(HOME)/libs -labc
为了利用链接的默认隐式规则,将这些标志添加到variablesLDFLAGS
,如下所示
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: 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命令(如rm
, cp
, install
等),以及特定于你的编译器和链接器的命令(例如,在你的shell提示下键入gcc -v --help
会给你一个gcc理解的选项列表几乎完整的(和非常长的)作为一个起点)。
有一点要注意的是,这些是传递给编译器/链接器的选项。 所以你应该看看编译器的手册页/文档来了解他们的angular色。