我已经使用cygwin生成了dll文件,并且正在尝试在Visual Studio中使用它。
作为cygwin编译的一部分,我得到了带有错误函数名的DEF(.def)文件。
使用MSVC附带的lib.exe程序,生成了.lib文件。
在MSVC中,我编写了一个程序,该程序使用了所创建的lib文件中的功能。
我收到链接器错误。
当我检查变形的名称时,DEF文件中的一个与MSVC中引发的错误中的一个不同。
我对这两者进行了拆解,发现MSVC用__cdecl
关键字破坏了函数名。
如何使用__cdecl
关键字在cygwin中创建错误的函数名称?我在cgwin编译中是否缺少任何标志?
视觉工作室:
乱七八糟的名字:
(__imp_?configure_tls_context @ client @ asio_http2 @ nghttp2 @@ YA?AVerror_code @ system @ boost @@ AAV456 @ AAVcontext @ ssl @ asio @ 6 @@ Z)
删除名称:
(__imp_class boost :: system :: error_code __cdecl
nghttp2 :: asio_http2 :: client :: configure_tls_context(class
boost :: system :: error_code&,class boost :: asio :: ssl :: context&)
Cygwin的DEF文件:
乱七八糟的名字:
_ZN7nghttp210asio_http26client21configure_tls_contextERN5boost6system10error_codeERNS2_4asio3ssl7contextE
删除名称:
nghttp2 :: asio_http2 :: client :: configure_tls_context(boost :: system :: error_code&,boost :: asio :: ssl :: context&)
最佳答案
作为基本规则;使用C ++代码,您始终需要使用完全相同的编译器来编译项目的所有代码。这包括可执行文件以及所有静态和动态库。 C ++没有ABI规范,并且所有编译器都可能以不同的方式处理名称,甚至新的次要版本的编译器都可能生成与以前版本所构建的代码不兼容的代码。
对于名称处理或数据结构布局等没有标准。
所以;始终使用完全相同的编译器重新编译所有源代码,或者为痛苦做准备。