我使用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。
答案 0 :(得分:0)
问题出在64位版本中。此构建是从32位构建创建的,但MSVC不会更改该过程中的库依赖项。结果,链接器试图将32位函数体链接到64位构建。由于成员函数调用约定不同,第一次检查失败的是名称查找。链接器永远不会达到检查其输入是否全部为64位的程度。
修复是手动更新库依赖项;第一个库的64位版本确实包含了正确的ns::Foo::Foo
。