C++ 导出符号意味着什么?

C++ 导出符号意味着什么?,c++,c,export,C++,C,Export,我一直在寻找“导出符号”这一术语。在C/C++或库(共享/静态)中,导出符号意味着什么?我们从哪里输出符号?为什么?导出一个符号与名称被编译器弄乱有什么关系?导出一个符号意味着“宣传”它在对象文件/库中的存在及其所在位置,以便其他模块可以导入(=链接到) 链接可以静态地或动态地进行,但无论哪种方式,链接器都必须知道符号是什么,它在哪里,导出的符号和导入的符号必须匹配才能进行链接。名称损坏与此相关(C++名称损坏在符号名称中包括符号的类型定义,导出和导入符号的损坏必须匹配,链接器才能正确链接导入和

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

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

链接可以静态地或动态地进行,但无论哪种方式,链接器都必须知道符号是什么,它在哪里,导出的符号和导入的符号必须匹配才能进行链接。名称损坏与此相关(C++名称损坏在符号名称中包括符号的类型定义,导出和导入符号的损坏必须匹配,链接器才能正确链接导入和导出)


例如:

假设您有一个库“STANDARDC”(随机名称)和您的程序SOMEPROG。程序SOMEPROG需要打印到控制台,因此它将调用
printf
。但实际上,您并没有在程序SOMEPROG中实现
printf
,您只是使用它(=导入它),而实现在其他地方

库标准C有一个它导出的符号列表,其中包括在该库中实现的所有函数,并且可以从外部调用(=导出的函数)
printf
是此类函数之一,因此它将出现在导出列表中

编译器检查了SOMEPROG.C,发现您引用了
printf
,但没有实现它。编译器将
printf
添加到结果SOMEPROG.obj的导入符号列表中,以便链接器链接中的实际实现


链接器获取SOMEPROG.obj文件和STANDARDC.lib文件,并查看SOMEPROG.obj中使用的函数。链接器发现
printf
未实现,它已导入,因此链接器将查看其拥有的所有.lib文件,并在导出的STANDARDC列表中找到匹配的
printf
。它从STANDARDC中获取
printf
的实现,并将其链接到您的程序中,无论您在哪里引用导入的符号
printf

查找declspec(dllimport/export),我相信您都可以找到很好的解释。此外,这个问题没有被否决,因为它是重复的,但可能是因为有这么多重复项建议了你,而你忽略了这些建议。你能用例子解释一下吗?我为什么要导出我的符号?