c++ - 导出符号是什么意思?

标签 c++ c export

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

最佳答案

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

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


例子:

假设您有一个库“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 的地方。

关于c++ - 导出符号是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903770/

相关文章:

c++ - 在 C++ 库中使用动态内存分配

c++ - 浮点运算的最佳实践

ios - 修剪 UIImage 边框

Javascript:为什么要获取 aTypeError:xxxx 不是在编译时使用 exports/require 的函数

database - 将数据导出为 C#/VB 格式,以便在 EF Code First 的数据库初始化中使用它们

python - 返回多个 HttpResponse 对象,这些对象是 Excel 电子表格

c++ - 如何干净地退出混合 C/C++ 的程序

C++ Auto 关键字 - Float 与 Int 问题

c - 在 ubuntu 上的 eclipse 中打开 .txt 文件时无输出显示

c++ - 对于 C/C++ 程序及其插件 DLL,最好的免费内存泄漏检测器是什么?