转换需要使用CMake构建reinterpret_cast错误

时间:2016-01-05 16:11:42

标签: c++ visual-c++ cmake

使用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)

1 个答案:

答案 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: VS command prompts

要使用cmake构建64位二进制文​​件,必须使用 x64 Cross Tools命令提示符

相关问题