名称修改如何与使用不同编译器编译的DLL和LIB一起使用

时间:2013-07-12 05:52:41

标签: c++

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

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

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

来自wiki

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.

1 个答案:

答案 0 :(得分:2)

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

  1. 按原样导出C ++“stuff”(类等),意识到它们只能使用相同的编译器(或专门设计为兼容的编译器),例如Intel的代码来自Microsoft的)。使后者工作通常也意味着使用相同的标准库代码(英特尔的代码)。
  2. 使用指定的中性调用约定(例如stdcall
  3. )仅导出C样式函数

    请注意,名称修改通常是您对此类问题的最小担忧。在大多数情况下,获取匹配的名称实际上非常简单。真正的问题是不同的编译器使用不同的调用约定生成代码。如果那些(精确地)不匹配,那么您可以期望的最好的结果是程序快速而干净地崩溃。名称修改的差异只是提前发现问题,并且在调用约定方面不同于销毁数据。