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