导出符号意味着什么?

问题描述 投票:9回答:1

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

c++ c export
1个回答
20
投票

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

链接可以静态或动态完成,但无论哪种方式,链接器都必须知道符号是什么,以及它在哪里,导出的符号和导入的符号必须匹配才能发生。名称修改与此相关(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

© www.soinside.com 2019 - 2024. All rights reserved.