C++ 和 C 是不是使用相同类型的链接器?

Posted

技术标签:

【中文标题】C++ 和 C 是不是使用相同类型的链接器?【英文标题】:Do C++ and C use the same kind linker?C++ 和 C 是否使用相同类型的链接器? 【发布时间】:2017-02-19 23:20:55 【问题描述】:

如题,C++和C在链接过程中是否使用同一种链接器?还有,对于C++和C的编译器,C++编译器是建立在C编译器之上的吗?

【问题讨论】:

链接根本不是编译过程的一部分。链接是一个完全不同的过程,它发生在编译完成之后。如果 C++ 编译器是在 C 编译器之上构建的,或者它是从头开始构建的,则取决于我们正在谈论的编译器。其中许多是封闭源代码,因此我们没有直接的了解方式。此外,这不是 C++ 或 C 问题。 gnu 编译器套件:是的,gcc 和 g++ 使用相同的链接器:ld @VadaPoché 为什么这不是 C++ 或 C 问题?它与代码无关,与编译无关,但如果不链接大多数代码,大多数编译都是无用的。恕我直言,标签在这里完全相关 我猜你的意思是“kind of”而不是“kind”,后者有同情的意思。但是我不敢编辑,因为我无法决定要么完全删除它,要么将其更正为“某种”,因为那是完全不同的问题 不仅 C 和 C++ 使用相同的链接器,而且(至少对于 Microsoft 品牌而言),相同的链接器用于 Fortran、COBOL 以及 Microsoft 生产的大多数其他编译语言。跨度> 【参考方案1】:

两种实现都使用相同的链接器。但是,C++ 必须对所链接事物的名称和类型进行编码,以支持函数重载,从而不能将它们与错误的函数链接。所以,如果你有两个这样的 C++ 函数:

 void func( int );
 void func( int, double);

然后 C++ 编译器将为这些函数生成名称,例如 func_intfunc_int_double。生成的确切名称是编译器特定的,C++ 标准没有指定。由于 C 不支持重载,因此 C 中不需要这种机制,但如果您想将 C++ 代码与 C 链接起来,则需要关闭这种所谓的名称修饰,这就是 extern "C" 构造所做的。

【讨论】:

以上是关于C++ 和 C 是不是使用相同类型的链接器?的主要内容,如果未能解决你的问题,请参考以下文章

混合 C 和 C++ 的库/链接器问题

C++ 抽象类模板 + 特定类型的子类 = 链接器有问题

在 C 和 C++ 中,链接器如何找到具有已实现函数的正确文件?

C 文件中的 C++ 文件中的链接器错误调用函数

C++ - 虚拟析构函数和链接器错误

Visual Studio 2010 C++:如何判断链接器实际尝试链接的 LIB 文件?