相同编译器、相同设置的名称修改差异

Name mangling differences on same compiler, same settings

我正尝试在 Windows 10 Visual Studio Community 2019 RC 上 link ASSIMP 加入我的项目。我用 CMake 和相同版本的 VS 构建了 ASSIMP。我已经 link 编辑了 lib 文件,所以一切正常。

mesh.obj : error LNK2019: unresolved external symbol
"public: class aiScene const * __cdecl Assimp::Importer::ReadFile(char const *,unsigned int)"
(?ReadFile@Importer@Assimp@@QEAAPEBVaiScene@@PEBDI@Z)
referenced in function
"public: static void __cdecl citrus::graphics::mesh::convertAnimationFromCollada(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)"
(?convertAnimationFromCollada@mesh@graphics@citrus@@SAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z)

关键部分是:

?ReadFile@Importer@Assimp@@QEAAPEBVaiScene@@PEBDI@Z

当我查看生成的 assimp lib 文件中的符号时,我看到:

?ReadFile@Importer@Assimp@@QEAAPEBUaiScene@@PEBDI@Z

如您所见,名称略有不同,不同之处在于 QEAAPEBV 更改为 QEAAPEBU。这可能是什么原因造成的?

使用undname命令之类的工具,我们发现这两个名字是

的错位形式
public: class aiScene const * __ptr64 __cdecl Assimp::Importer::ReadFile(char const * __ptr64,unsigned int) __ptr64

public: struct aiScene const * __ptr64 __cdecl Assimp::Importer::ReadFile(char const * __ptr64,unsigned int) __ptr64

用于 VU 版本。所以你可以看到区别在于一个被声明为 class aiScene,另一个被声明为 struct aiScene.

在您的代码中某处您不一致地声明了 aiScene 是什么。