2012-06-05 158 views
7

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

+0

寻找_declspec(dllimport/export),我相信你可以找到很好的解释。 –

+2

此外,这个问题没有被降低,因为它是一个重复的,但可能是因为你被重复建议,你忽略了这些建议。 –

+1

它为什么不重要? – littleadv

回答

16

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

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

+1

你能解释一下这个例子吗?为什么我要导出我的符号? – Raulp

+1

@softy增加了一个例子。 – littleadv