[英]Is the GCC link option truly necessary when linking to a static library?
我最近一直在玩 GCC 并且一直在尝试链接选项。 我有点困惑为什么在静态链接到存档文件时需要链接选项 -l 。 似乎您可以将 .a 文件当作普通的 object 文件一样扔掉。
例如,使用以下 make 文件:
test1 : main.c libfunc.a
gcc main.c -L. -lfunc -o main.out
test2 : main.c libfunc.a
gcc main.c libfunc.a -o main.out
libfunc.a : func1.c func2.c
gcc func1.c -c
gcc func2.c -c
ar cr libfunc.a func1.o func2.o
Make target test1
使用 GCC 的链接选项链接到归档文件。 目标test2
只是直接包含存档文件。 构建和运行每个 output 似乎会产生相同的可执行文件。
有几种方法可以告诉gcc
使用什么文件。 (or the two arguments -l
) says “Search for a library named ”.
-l
形式的参数(或两个 arguments -l
)表示“搜索名为的库”。 根据GCC 文档,此参数被传递给 linker(通常是
ld
命令)。 . linker 查找名称类似于lib .
. extension , where is one of the known library files extensions such as
.a
or .so
, and it looks for files with those names in a list of library directories it has. . extension
,其中是已知的库文件扩展名之一,例如
.a
或.so
,它会在它拥有的库目录列表中查找具有这些名称的文件。 您可以使用-L
开关添加要搜索的目录。
当 linker 找到该库时,它就像您指定了路径一样使用它,因此无论您使用-l
还是使用其路径指定库,最终结果都是相同的。
通过使用路径,您可以指定不在已知库目录中或具有不寻常名称的库。
请注意,linker 处理库的方式与 object 文件不同。 当 linker 处理 object 文件时,它将 object 文件中的所有内容合并到正在构建的 Z78E6221F6393D1356D81DB 文件中。 当 linker 处理库文件时,它仅合并库中那些为先前模块引用但尚未解析的符号提供符号定义的模块。 例如,如果您编写的程序使用sqrt
但不使用sin
,那么当 linker 在读取您的 object 模块后处理libm.a
时,它将从库中获取sqrt
模块,而不是sin
模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.