导出符号意味着什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导出符号意味着什么?相关的知识,希望对你有一定的参考价值。

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

答案

导出符号意味着在其目标文件/库中“广告”它的存在,以及它可以被其他模块导入(=链接到)。

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


例:

假设您有一个库“STANDARDC”(随机名称)和您的程序SOMEPROG。程序SOMEPROG需要打印到控制台,所以它将调用printf。但是你实际上并没有在你的程序SOMEPROG中实现printf,你只需要使用它(= import it),而实现在其他地方。

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

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

链接器获取您的SOMEPROG.obj文件和STANDARDC .lib文件,并查看SOMEPROG.obj中使用的函数。链接器发现printf未实现,它已导入,因此链接器查看它具有的所有.lib文件,并在导出的STANDARDC列表中找到匹配的printf。它需要从STANDARDC实施printf并将其链接到您的程序,无论您引用导入的符号printf

以上是关于导出符号意味着什么?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

MEF:“可组合部件应包含至少一个导出”

什么是“/ *!在生成的webpack 4代码中找不到静态导出* /“是什么意思?

为啥这个代码片段说包含错误?

[搬运] 将 Visual Studio 的代码片段导出到 VS Code

谷歌地图不显示在片段中