导出符号是什么意思

What does exporting a symbol mean?

本文关键字:意思 是什么 符号      更新时间:2023-10-16

我一直在寻找"导出符号"这个术语。导出符号在 C/C++ 中或相对于库(共享/静态)意味着什么?我们从哪里导出符号,为什么?导出编译器名称为重整的符号是什么关系?

导出符号意味着"宣传"它在目标文件/库中的存在以及它的位置,以便它可以被其他模块导入(=链接到)。

链接

可以静态或动态完成,但无论哪种方式,链接器都必须知道符号是什么以及它在哪里,并且导出的符号和导入的符号必须匹配才能发生。名称重整与此相关(C++名称重整在符号名称中包含符号的类型定义,并且导出和导入的符号的重整必须匹配,链接器才能正确链接导入-导出)。


例:

假设你有一个库"STANDARDC"(随机名称)和你的程序SOMEPROG。程序 SOMEPROG 需要打印到控制台,因此它会调用printf 。但是你实际上并没有在你的程序 SOMEPROG 中实现printf,你只是使用它(=导入它),而实现在其他地方。

库 STANDARDC 有一个它导出的符号列表,其中包括在该库中实现的所有函数,并且可以从外部调用(=导出函数)。 printf是此类函数之一,因此它将出现在导出的列表中。

编译器通过你的 SOMEPROG。C 并看到您引用了 printf ,但没有实现它。编译器将printf添加到生成的 SOMEPROG.obj 的导入符号列表中,以便链接器链接实际实现。

链接器获取您的 SOMEPROG.obj 文件

和 STANDARDC .lib 文件,并查看 SOMEPROG.obj 中使用了哪些函数。链接器发现printf未实现,而是导入,因此链接器会查找它拥有的所有 .lib 文件,并在 STANDARDC 的导出列表中找到匹配的printf。它从 STANDARDC 获取printf的实现,并将其链接到您的程序中,只要您引用导入的符号printf