我使用cygwin生成了dll文件,我试图在Visual Studio中使用它。在C++中名称修饰或名称损坏
- 我得到了DEF(.def)文件,这个文件中包含了错误的函数名称,作为cygwin编译的一部分。
- 使用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 ::上下文&)
这不仅仅是你必须处理的名字,还可能是调用约定和其他问题,比如POSIX兼容性。为什么不简单地用VC++重新编译库?或者用Cygwin GCC编译所有东西。 –
我遵循以下链接https://cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin中的步骤。基于该链接中提供的解决方案,我认为在cygwin中生成的dll可以在MSVC中使用,并且我在Cygwin中缺少一些编译器标志,因此我正面临链接器错误。用VC++重新编译库是我的最后手段。 –