以下回答来自ChatGPT:
在Visual Studio中(在常见的软件开发上下文中),术语“exported symbol”和“external symbol”指的是相关但又稍微不同的概念。
1.导出符号(Exported Symbol)
<1> 导出符号通常是指库或模块中可供其他模块或应用程序使用的符号(例如函数或变量)。
<2> 在 Visual Studio 和 Windows 开发环境中,导出符号通常涉及用特殊关键字或指令标记它,以便它成为库的公共接口的一部分。这允许程序的其他部分或其他程序使用该符号。
<3> 创建动态链接库(.dll)或共享对象(.so)时通常使用导出符号,其中标记为导出的符号在导出表中明确列出。
2.外部符号(External Symbol)
<1> 另一方面,外部符号是指在特定模块(如源文件或库)中引用但预计在另一个模块或库中定义的符号。
<2> 这意味着引用外部符号的模块不在本地定义它,而是依赖另一个模块或库来提供其定义。
<3> 实际上,如果在构建过程中定义符号的必要模块没有正确链接,则外部符号通常会导致链接器错误。
3.关键区别:
(1) 范围: 导出符号是专门为其他模块或应用程序提供的,通常通过 DLL 等库提供。外部符号是对预期在其他地方定义的符号的引用。
(2) 目的: 导出符号便于模块间通信和重用。外部符号表示对其他模块提供的定义的依赖关系。
(3) 用法: 导出符号被明确标记为在其定义模块之外可见。外部符号在模块内被引用而没有定义,依赖于其他模块提供定义。
总之,虽然两个术语都与跨不同模块或库使用的符号有关,但“导出符号”具体表示标记为外部使用的符号,而“外部符号”是指没有本地定义的引用,期望该定义在构建或运行时环境的其他地方可用。
我自己总结这个回答:
<1> 导出符号就是在某个模块或者是库中用于其他模块或应用程序的变量或函数的符号。通常在使用动态链接库时使用。这就意味着导出符号很可能会跨越软件项目使用。
<2> 外部符号在一个模块或库中定义,但对其引用会在另一个模块进行。如果定义外部符号的那个模块没有被正确链接,就会导致链接器错误。
<3> 不论是导出符号还是外部符号,都是用来表示某个变量或者是函数的。