导出符号意味着什么?

时间:2012-06-05 19:37:29

标签: c++ c export

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

1 个答案:

答案 0 :(得分:20)

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

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