我一直在寻找这个术语“导出一个符号”。在C/C++或与库(共享/静态)相关的情况下,导出符号意味着什么?我们从哪里导出符号?为什么?输出一个名称被编译器破坏的符号有什么关系?
发布于 2012-06-06 03:38:36
导出一个符号意味着“公告”它在你的目标文件/库中的存在和它所在的位置,这样它就可以被其他模块导入(=链接到)。
链接可以是静态的或动态的,但无论哪种方式,链接器都必须知道符号是什么,以及它在哪里,并且导出的符号和导入的符号必须匹配才能发生链接。名称损坏与此相关(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文件,并在导出的标准printf
列表中找到匹配的STANDARDC。它从STANDARDC获取printf
的实现,并在引用导入的符号printf
的任何地方将其链接到程序中。
https://stackoverflow.com/questions/10903770
复制相似问题