makefile中-I和-L标志的用法是什么?
这些通常是链接器命令行的一部分,并且直接在目标操作中提供,或者更常见地分配给make
将扩展为形成链接命令的变量.在这种情况下:
-L
是包含库的目录的路径.库的搜索路径.
-l
是要链接到的库的名称.
例如,如果要链接到~/libs/libabc.a
要添加的库:
-L$(HOME)/libs -labc
要利用默认的隐式隐式规则进行链接,请将这些标志添加到变量中LDFLAGS
,如下所示
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: 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
如果链接以错误的顺序完成,一些优化(最明显的)将失败.
要真正了解makefile,您还需要很好地理解项目工具链的所有组件的命令行.类似的选项-I
并-L
没有被使自己的理解.相反,make正在尝试创建一个命令行,该命令行将执行一个工具来将必备文件转换为目标文件.
通常,这是一个C或C++源文件被编译为目标文件,并最终链接以获取可执行文件.
在这种情况下,您需要查看编译器的手册,尤其是与其理解的命令行选项相关的位.
总而言之,这些特定选项在编译器和链接器中非常标准.-I
将一个目录添加到编译器搜索到的#include
一行中命名的文件-L
列表中,并将一个目录添加到链接器搜索的用于使用该-l
选项命名的库的位置列表.
底线是,一个makefile的"语言",是生成文件本身的语法的组合,你的shell已知使(通常是/bin/sh
或类似的东西),常见的shell命令(如rm
,cp
,install
,等),和特定于编译器和链接器的命令(例如gcc -v --help
,在shell提示符下键入将为您提供几乎完整(且非常长)的gcc所理解的选项列表作为一个起点).