导出符号意味着什么?

Rau*_*ulp 10 c c++ export

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

lit*_*adv 22

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

链接可以静态或动态完成,但无论哪种方式,链接器都必须知道符号是什么,以及它在哪里,导出的符号和导入的符号必须匹配才能发生.名称修改与此相关(C++名称修改包含符号名称中的符号类型定义,导出和导入符号的修改必须匹配链接器以正确链接导入 - 导出).


例:

假设您有一个库"STANDARDC"(随机名称)和您的程序SOMEPROG.程序SOMEPROG需要打印到控制台,所以它会调用printf.但是你实际上没有printf在你的程序SOMEPROG中实现,你只需要使用它(= import it),而实现在其他地方.

库STANDARDC有一个它导出的符号列表,其中包括在该库中实现的所有函数,可以从外部调用(=导出函数).printf是这样的功能之一,因此它将出现在导出的列表中.

编译器通过你的SOMEPROG.C看到你引用printf,但是它没有实现.编译器将结果添加printf到生成的SOMEPROG.obj的导入符号列表中,以便链接器链接实际的实现.

链接器获取您的SOMEPROG.obj文件和STANDARDC .lib文件,并查看SOMEPROG.obj中使用的函数.链接器发现printf未实现,导入它,因此链接器查看它具有的所有.lib文件,并printf在导出的STANDARDC列表中找到匹配项.它需要printfSTANDARDC 的实现,并在引用导入符号的任何地方将其链接到您的程序中printf.