gcc中的-l选项

gcc中的-l选项,gcc,Gcc,我刚刚开始阅读这本书:并尝试编译第一个示例代码,与中的相同。 尽管编译问题已通过以下命令解决: gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue 我在GCC手册中查找了它,没有找到GCC选项-lxxx的含义,其中xxx代表头文件的基本名称(在本例中,它是apue.h)。根据手册,xxx应该是一些库文件,对于共享对象文件,要么以.so结尾,对于静态库,要么以.a结尾 有人能解释一下吗?Thx提前:)该-l选项告诉

我刚刚开始阅读这本书:并尝试编译第一个示例代码,与中的相同。 尽管编译问题已通过以下命令解决:


gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
我在GCC手册中查找了它,没有找到GCC选项-lxxx的含义,其中xxx代表头文件的基本名称(在本例中,它是apue.h)。根据手册,xxx应该是一些库文件,对于共享对象文件,要么以.so结尾,对于静态库,要么以.a结尾


有人能解释一下吗?Thx提前:)

-l
选项告诉gcc链接到指定的库中。在本例中,库是
apue
,它恰好与头文件的名称对齐,这正是
apue
程序员设计项目的方式。实际上,
-l
选项与头文件无关。正如cas在评论中所说,阅读手册页,它将为您提供更多信息。

这一点记录在:

-llibrary

链接时搜索名为library的库

在命令中写入此选项的位置会有所不同;这个 链接器按库和对象文件的顺序进行搜索 是指定的。因此,
`foo.o-lz bar.o'
搜索库
`z'
在文件
`foo.o'
之后,但在
`bar.o'
之前。如果
`bar.o'
引用 对于
`z'
中的函数,可能无法加载这些函数。

链接器搜索库的标准目录列表, 这实际上是一个名为
`libliblibrary.a'
的文件。然后,链接器使用该文件,就好像它是按名称精确指定的一样

搜索的目录包括几个标准系统目录 加上您用
`-L'
指定的任何值

通常,通过这种方式找到的文件是库文件--归档文件 其成员是对象文件。链接器通过以下方式处理存档文件: 扫描其中定义符号的成员,这些符号到目前为止 已被引用但未定义。但是如果找到的文件是 普通对象文件,它以通常的方式链接。唯一的 使用
`-l'
选项和指定文件名之间的区别在于
`-l'
`lib'
`.a'
包围库 并搜索多个目录


mangcc
,搜索
-llibrary
@cas gcc手册页不描述选项
-lheaderFile
的行为。这都是关于。某某和。一个图书馆。如果程序员没有明确指定include/library路径,编译器将无法找到头文件和实现(.c和/或.o)。我只是不知道编译器在幕后是如何做这些事情的。没有这样的选择
-l
(小写l)用于指定库,而不是头文件。也许您正在考虑使用
-I
(大写I)来指定要搜索头文件的目录。@cas我没有注意到lib目录中有一个名为libapue.a的文件。THX:)我认为链接头文件与链接.o/.a/.so文件不同。毕竟,.h文件根本没有实现。@ShihaoXu:正确:没有“链接头文件”这样的东西。头文件使用预处理器的
#include
指令包含。在您的示例中,UNIX环境中的高级编程提供了名为
apue.h
的头文件,您可以
#include
,以便代码可以使用符号声明,还有一个名为
apue.o
apue.a
apue.so
的库,您可以
-l
将实际符号定义链接到程序中。(这是一个很常见的模式)啊哈!我在随书提供的库目录中找到了一个名为libapue.a的文件。书中的编译示例根本没有提到它……我只是错误地将-lapue识别为“链接头文件apue.h”。谢谢@石浩旭:不客气!是的,您是对的——文档指定它应该是
libapue.a
;我不知道我是怎么错过的,但我很高兴你自己发现了这一点。:-)这对我来说确实有些道理。您是否确切地知道编译器如何知道要查找和链接include文件和lib的目录?即使我在每个源文件中指定头文件的相对/绝对路径,它也不起作用。编译器有几个标准位置可以查找头文件,如/usr/include,还有几个标准位置可以查找库,如/usr/lib。您可以使用-I选项添加目录以搜索头文件,使用-L选项添加库搜索目录。现在,我知道如何使用“gcc最重要的三个选项(-L-L-I)”。)谢谢回答。