为什么目标文件的顺序对静态库很重要?
Why the order of object files is important for static libraries?
我创建了一些文件:
file1.c
file2.c
file3.c
我使用 gcc -c file1.c
编译它们,我对其他文件也这样做,然后我得到了目标文件。后来我使用 ar
工具创建静态库。
Everythink 工作正常,但 ar
有选项
ar -m -a file.o lib.a filetomove.o
要移动库中的目标文件,为什么目标文件的顺序很重要?请向我展示对象文件必须按正确顺序排列的示例。
随着时间的推移,这个问题越来越少,但很长一段时间以来,链接器都是单通道的。这意味着如果符号在 a.o 中定义并在 b.o 中引用,则链接器必须在 "see" b.o 之前 a.o 否则它将永远找不到引用的定义。
在其他情况下,有时会在最后链接的库中提供 "default" 函数。这是嵌入式系统开发中的一种流行技术。您可以通过在静态库或目标模块中链接它来提供覆盖函数,但如果您不这样做,最后一个库将提供满足链接器的符号。
我创建了一些文件:
file1.c
file2.c
file3.c
我使用 gcc -c file1.c
编译它们,我对其他文件也这样做,然后我得到了目标文件。后来我使用 ar
工具创建静态库。
Everythink 工作正常,但 ar
有选项
ar -m -a file.o lib.a filetomove.o
要移动库中的目标文件,为什么目标文件的顺序很重要?请向我展示对象文件必须按正确顺序排列的示例。
随着时间的推移,这个问题越来越少,但很长一段时间以来,链接器都是单通道的。这意味着如果符号在 a.o 中定义并在 b.o 中引用,则链接器必须在 "see" b.o 之前 a.o 否则它将永远找不到引用的定义。
在其他情况下,有时会在最后链接的库中提供 "default" 函数。这是嵌入式系统开发中的一种流行技术。您可以通过在静态库或目标模块中链接它来提供覆盖函数,但如果您不这样做,最后一个库将提供满足链接器的符号。