0

我很确定我对 C++ Name Mangling 没有清楚的了解。但据我所知,C++ Name Mangling 没有任何问题。所以我的问题是

想想我使用一个编译器编译了 DLL 或 LIB。他们尝试在使用不同编译器编译的程序中使用上述 DLL 或 LIB。

那么第二个编译器如何识别该 LIB 或 DLL 中的函数、类、数据类型等?(我猜上面的两个编译器有不同的名称修饰)

来自维基

There isn't a standard scheme by which even trivial C++ identifiers are mangled, and consequently different compiler vendors (or even different versions of the same compiler, or the same compiler on different platforms) mangle public symbols in radically different (and thus totally incompatible) ways.

4

1 回答 1

2

一般来说,您有两种选择:

  1. 按原样导出 C++“东西”(类等),意识到它们只能与同一个编译器(或专门设计为兼容的编译器,例如英特尔与微软代码)一起工作。使后者工作通常也意味着使用相同的标准库代码(英特尔的做法)。
  2. 使用指定的中性调用约定(例如stdcall.

请注意,名称修饰通常是您对此类事情最不关心的问题。在大多数情况下,让名称匹配实际上非常容易。真正的问题是不同的编译器使用不同的调用约定生成代码。如果这些不匹配(精确地),您可以希望的最好结果是生成的程序快速而干净地崩溃。名称修饰的差异只是尽早发现问题,并防止调用约定的差异破坏您的数据。

于 2013-07-12T06:06:57.250 回答