使用MSVC 120,Visual Studio 2013在Windows上通过CMake编译我的源代码时出现以下错误。当我直接从VisualStudio构建时,我没有错误。只有在生成CMake构建文件后通过命令行构建时才会发生错误。
错误C2664:' void gluTessCallback(GLUtesselator *,GLenum,void (__stdcall *)(void))' :无法从' GLvoid转换参数3 (__cdecl *(void)' void(__ stdcall *)(void)' 此转换需要reinterpret_cast,C风格的强制转换或函数式转换
实际代码是这个函数:
static void edgeFlagCallback(GLboolean)
{
//some code here
}
void MyClass:Foo()
{
gluTessCallback(tess, GLU_TESS_EDGE_FLAG ,reinterpret_cast<GLvoid ( *)()>(edgeFlagCallback));
}
它也可以在Linux上使用GCC编译好。也许我必须设置一些额外的编译器参数,但到目前为止我还没有找到什么。我也不理解错误,因为我确实使用了强制转换这个案例。 这些是我为CMake中的MSVC项目添加的标志:
add_definitions(-DWIN32 -D_DEBUG -D_UNICODE -DUNICODE -D_LIB -D_CRT_SECURE_NO_WARNINGS)
答案 0 :(得分:0)
gluTessCallback函数需要* GLvoid类型的函数(__stdcall )(void)作为第三个参数。所以__stdcall(https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx)是函数签名的一部分。
在x64版本中忽略__ stdcall和__cdecl。这就是为什么它适用于VS和Linux而不是命令提示符(x86)。
Visual Studio 2013附带三个不同的cmds:
要使用cmake构建64位二进制文件,必须使用 x64 Cross Tools命令提示符。