MSVC2013对ctor的调用约定感到困惑

时间:2014-10-07 10:53:28

标签: visual-c++ linker static-libraries

我使用ns::Foo::Foo/Gd int编译为静态库,并尝试从另一个也使用/Gd编译的静态库中使用它。

第一个库包含public: __thiscall ns::Foo::Foo(void))似乎是正确的,因为the documentation for /Gd表明成员的调用约定是__stdcall

当链接excutable时,它会失败,因为尽管使用public: __cdecl ns::Foo::Foo(void))构建了所有内容,但第二个库中/Gd的外部无法解析。我没有使用任何#pragma来更改调用约定。

为什么MSVC ++在导入时无法使用__stdcall调用约定,我该如何解决?

64位构建,BTW。

1 个答案:

答案 0 :(得分:0)

问题出在64位版本中。此构建是从32位构建创建的,但MSVC不会更改该过程中的库依赖项。结果,链接器试图将32位函数体链接到64位构建。由于成员函数调用约定不同,第一次检查失败的是名称查找。链接器永远不会达到检查其输入是否全部为64位的程度。

修复是手动更新库依赖项;第一个库的64位版本确实包含了正确的ns::Foo::Foo