相同编译器、相同设置的名称修改差异
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
用于 V
和 U
版本。所以你可以看到区别在于一个被声明为 class aiScene
,另一个被声明为 struct aiScene
.
在您的代码中某处您不一致地声明了 aiScene
是什么。
我正尝试在 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
用于 V
和 U
版本。所以你可以看到区别在于一个被声明为 class aiScene
,另一个被声明为 struct aiScene
.
在您的代码中某处您不一致地声明了 aiScene
是什么。