当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《makefile中-I和-L有什么区别?》经验,为你挑选了2个好方法。

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



1> Nathan Fellm..:

这些通常是链接器命令行的一部分,并且直接在目标操作中提供,或者更常见地分配给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如果链接以错误的顺序完成,一些优化(最明显的)将失败.



2> RBerteig..:

要真正了解makefile,您还需要很好地理解项目工具链的所有组件的命令行.类似的选项-I-L没有被使自己的理解.相反,make正在尝试创建一个命令行,该命令行将执行一个工具来将必备文件转换为目标文件.

通常,这是一个C或C++源文件被编译为目标文件,并最终链接以获取可执行文件.

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

总而言之,这些特定选项在编译器和链接器中非常标准.-I将一个目录添加到编译器搜索到的#include一行中命名的文件-L列表中,并将一个目录添加到链接器搜索的用于使用该-l选项命名的库的位置列表.

底线是,一个makefile的"语言",是生成文件本身的语法的组合,你的shell已知使(通常是/bin/sh或类似的东西),常见的shell命令(如rm,cp,install,等),和特定于编译器和链接器的命令(例如gcc -v --help,在shell提示符下键入将为您提供几乎完整(且非常长)的gcc所理解的选项列表作为一个起点).

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有