导出符号意味着什么?
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 中使用 @ 和 符号格式化代码片段?
什么是“/ *!在生成的webpack 4代码中找不到静态导出* /“是什么意思?