【问题标题】:Conversion requires reinterpret_cast error building with CMake转换需要使用 CMake 构建 reinterpret_cast 错误
【发布时间】:2016-01-05 16:11:41
【问题描述】:

在 Windows 上使用 MSVC 120、Visual Studio 2013 通过 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));
 }

它也可以在带有 GCC 的 Linux 上编译。也许我必须设置一些额外的编译器参数,但到目前为止我没有找到什么。另外我不明白这个错误,因为在这种情况下我确实使用了 cast。 这些是我在 CMake 中为 MSVC 项目添加的标志:

add_definitions(-DWIN32 -D_DEBUG -D_UNICODE -DUNICODE -D_LIB -D_CRT_SECURE_NO_WARNINGS)

【问题讨论】:

  • 您使用的是哪个命令提示符? x86 还是 x64?
  • 我尝试添加 Win64,但它看起来默认使用 x86 编译。在 VisualStudio 中我以 x64 为目标。也许我必须升级 CMake。我目前有 3.0 版
  • Visual Studio 应该带有几种不同的命令提示符,一种用于 x86,另一种用于 x64。您遇到的问题仅发生在 x86 上。
  • 我明白了,但我不知道如何通过 CMake 命令提示符命令调用它。试过:cmake -G"Visual Studio 12 2013 Win64" 看起来它仍然使用 x86。

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


【解决方案1】:

gluTessCallback 函数需要 *GLvoid (__stdcall ) (void) 类型的函数作为第三个参数。所以 __stdcall (https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) 是函数签名的一部分。

__stdcall 和 __cdecl 在 x64 构建中被忽略。这就是为什么它可以在 VS 和 Linux 中运行,但不能在命令提示符 (x86) 中运行。

Visual Studio 2013 带有三种不同的 cmd:

要使用 cmake 构建 64 位二进制文​​件,必须使用 x64 交叉工具命令提示符

【讨论】:

  • 是的,谢谢你的信息,我也想通了,但不明白如何从 CMake 启动 x64 cmd 工具。现在看来我应该通过这个 cmd 运行 Cmake build。我看寻求一种自动化的方法,以便可以从任何 cmd 调用 CMake 并使用 x64 工具链构建它。
猜你喜欢
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多