2017-06-25 46 views
0

我使用cygwin生成了dll文件,我试图在Visual Studio中使用它。在C++中名称修饰或名称损坏

  1. 我得到了DEF(.def)文件,这个文件中包含了错误的函数名称,作为cygwin编译的一部分。
  2. 使用lib.exe程序作为MSVC的一部分,我生成了.lib文件。

在MSVC中,我编写了一个程序,它使用创建的lib文件中的函数。

我得到了链接器错误。 当我检查了重名的名称时,DEF文件中的名称与MSVC中引发的错误中的名称不同。 我把这两个都去掉了,发现MSVC用__cdecl这个关键字破坏了函数名。

如何在012g关键字中在cygwin中创建破损的函数名称?我在cgwin编译中缺少任何标志吗?

的Visual Studio:
重整名称:??

(__imp_ configure_tls_context @客户@ asio_http2 @ nghttp2 @@ YA AVerror_code @系统@升压@@ AAV456 @ AAVcontext @ SSL @ ASIO @ 6 @@ Z)

Demangled名称:

(__imp_class的boost ::系统:: ERROR_CODE __cdecl nghttp2 :: asio_http2 ::客户:: CONF igure_tls_context(类 的boost ::系统:: ERROR_CODE &,类boost ::支持ASIO :: SSL ::背景&)

从Cygwin的DEF文件: 重整名称:

_ZN7nghttp210asio_http26client21configure_tls_contextERN5boost6system10error_codeERNS2_4asio3ssl7contextE

Demangled name:

nghttp2 :: asio_http2 ::客户:: configure_tls_context(升压::系统:: ERROR_CODE &,升压:: ASIO :: SSL ::上下文&)

+2

这不仅仅是你必须处理的名字,还可能是调用约定和其他问题,比如POSIX兼容性。为什么不简单地用VC++重新编译库?或者用Cygwin GCC编译所有东西。 –

+0

我遵循以下链接https://cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin中的步骤。基于该链接中提供的解决方案,我认为在cygwin中生成的dll可以在MSVC中使用,并且我在Cygwin中缺少一些编译器标志,因此我正面临链接器错误。用VC++重新编译库是我的最后手段。 –

回答

2

作为一般的规则;用C++代码你总是需要编译全部代码为你的项目用完全一样的编译器。这包括可执行文件和所有静态和动态库。 C++没有ABI规范,所有编译器都可能会对名称进行不同的修改,甚至编译器的新版本也可能产生与以前版本构建的代码不兼容的代码。 没有标准名称修改或数据结构布局等。

所以;总是重新编译全部源代码与完全相同编译器或准备一个痛苦的世界。

+0

我也认为相同的“编译器可能会改变名称的不同”。我跟着这个链接[链接](https://cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin)在MSVC中使用cygwin生成的dll。也许提供的解决方案仅适用于C而不适用于C++。 –

相关问题