我需要使用 "ranlib" / "ar -s" 来进行静态链接吗?

7

我没有找到任何关于为什么需要使用 ranlib / ar -s 进行静态链接的适当信息。

假设我有一个由多个模块组成的应用程序。每个模块都有自己的代码文件夹,并且对象文件在它们自己的文件夹中创建:module1/%.c → bin/module1/%.o。对于每个模块,我会创建一个 .a 文件:ar -rc bin/module1.a bin/module1/….o。整个程序通过 gcc bin/module1.a … moduleN.a -o bin/app 进行编译。

在这种情况下,为 .a 文件创建索引有什么作用?即使我不为 .a 文件添加索引,编译和程序也可以正常工作。但是,我发现的每个示例都是在将最后一个对象文件添加到存档后调用了 ranlib

这个问题不特定于 Linux/Mac/Windows。


相关回答:https://dev59.com/p1YN5IYBdhLWcg3wJFJm#47924864 - kelvin
2个回答

10
如果您使用的是POSIX兼容系统,则不需要。根据规范
当使用ar工具创建或更新这种存档的内容时,符号表将被重建。 ar -sranlib的唯一用途是在使用strip命令剥离后重新构建符号表。

4
从“构建并使用静态和共享C库”:(http://docencia.ac.upc.edu/FIB/USO/Bibliografia/unix-c-libraries.html) “在创建或修改存档之后,需要对其进行索引。编译器稍后会使用此索引来加速库内符号查找,并确保库中符号的顺序在编译过程中不重要(当我们在本教程的最后深入研究链接过程时,这将更容易理解)。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接