我刚刚开始阅读这本书:Advanced Programming in Unix Enviornment并尝试编译第一个示例代码,与this thread中的代码相同。 尽管使用以下命令解决了编译问题:
gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue
我在GCC手册中查了一下,无法找到gcc选项-lxxx的含义,其中xxx代表头文件的基本名称(在这种情况下,它是apue。 H)。根据手册,xxx应该是一些库文件,对于共享对象文件以.so结尾,对于静态库以.a结尾。
有人可以解释一下吗? Thx提前:))
答案 0 :(得分:3)
§2.13 "Options for Linking" in the GCC manual中记录了这一点:
-llibrary
链接时搜索名为 library 的库。
在您编写此选项的命令中,它会有所不同;该 链接器按照它们的顺序搜索进程库和目标文件 是指定的。因此,
`foo.o -lz bar.o'
搜索了库`z'
在文件`foo.o'
之后但在`bar.o'
之前。如果`bar.o'
引用 对于`z'
中的函数,可能无法加载这些函数。
链接器搜索库的标准目录列表, 这实际上是一个名为
`liblibrary.a'
的文件。然后,链接器使用此文件,就好像它已按名称精确指定一样。搜索的目录包括几个标准系统目录 加上您使用
`-L'
指定的任何内容。通常以这种方式找到的文件是库文件 - 存档文件 其成员是目标文件。链接器处理归档文件 通过它扫描定义到目前为止的符号的成员 被引用但未定义。但是,如果找到的文件是 普通的目标文件,它以通常的方式链接。唯一的 使用
`-l'
选项和指定文件名之间的区别在于`-l'
围绕库与`lib'
和`.a'
并搜索几个目录。
答案 1 :(得分:1)
-l
选项告诉gcc链接到指定的库中。在这种情况下,库是apue
,它恰好与头文件的名称对齐,就是apue
编码器设计项目的方式。实际上,-l
选项与头文件无关。就像cas在评论中所说,阅读联机帮助页,它会给你更多的信息。