导出符号是什么意思?

16

我一直在寻找这个术语"导出符号"。 在C / C ++中,导出符号是什么意思?与库(共享/静态)有关吗?我们从哪里导出符号以及为什么要这样做? 导出符号与编译器名称修饰的关系是什么?


寻找 _declspec(dllimport/export),我相信你能找到很好的解释。 - Luchian Grigore
2
此外,这个问题并不是因为重复而被踩,而很可能是因为你被 SO 建议了重复的问题,但你忽略了这些建议。 - Luchian Grigore
1个回答

34
导出符号意味着在您的目标文件/库中“宣传”其存在以及其位置,以便其他模块可以导入(链接到)它。链接可以静态或动态完成,但无论哪种方式,链接器都必须知道符号是什么,它在哪里,导出的符号和导入的符号必须匹配,才能进行链接。名称重整与此相关(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接