【问题标题】:cmake not finding gl.h on OS Xcmake 在 OS X 上找不到 gl.h
【发布时间】:2014-11-04 21:22:53
【问题描述】:

我在 OS X 10.10 上并尝试使用 GLUT 和 OpenGL 构建一个 C“项目”。 我将其简化为展示我的问题的最小示例。我有以下CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
FIND_PACKAGE(OpenGL REQUIRED)
FIND_PACKAGE(GLUT REQUIRED)

if(OpenGL_FOUND) # never true, but printed as true
    link_directories(${OpenGL_LIBRARY_DIRS})
    include_directories(${OpenGL_INCLUDE_DIR})
endif(OpenGL_FOUND)

if(GLUT_FOUND)
    link_directories(${GLUT_LIBRARY_DIR})
    include_directories(${GLUT_INCLUDE_DIR})
endif(GLUT_FOUND)

# print all vars because wtf
get_cmake_property(_v VARIABLES)
foreach(_v ${_v})
   message(STATUS "${_v}=${${_v}}")
endforeach()


add_executable(main main.c)

target_link_libraries(main ${GLUT_LIBRARY} ${OPENGL_LIBRARY})

main.c 只是一个包含两个标题的虚拟对象:

#include <gl.h>
#include <glut.h>
int main()
{    
   return 0;
}

现在,cmake . 运行良好,并且出于调试目的打印所有变量。我从某个地方获取了代码,我对 cmake 的了解还不够,无法知道它是否在做我认为的事情。无论如何,运行make 会返回

main.c:1:10: fatal error: 'gl.h' file not found
#include <gl.h>
         ^
1 error generated.

标头gl.h 实际上存在于/System/Library/Frameworks/OpenGL.framework/Headers 中,因此应该由cmake 找到,特别是因为glut.h 具有相同的结构(只需将OpenGL 替换为GLUT)并且发现很好。此外,令我困惑的是if(GLUT_FOUND)... 中的块从未执行(尝试将message 语句放入其中),但在打印的变量中它显示OPENGL_FOUND=TRUE。但是删除 if 条件不会改变任何事情。

真正的问题:到底发生了什么?为什么 a) cmake 找不到标头,除非特别包含,b) 尽管 OPENGL_FOUND 打印为 TRUE,但 if 块不执行,c) glut.h 没有出现此类问题?花了几个小时在这上面,无法理解为什么。

【问题讨论】:

  • 正确的变量是OPENGL_FOUND。对于所有其他变量也是如此。使用大写的OPENGLFindOpenGL 也没有设置LIBRARY_DIR。你真的在看文档吗?
  • 大写或否在这里没有任何区别。我也不确定它是否确实(?)关于变量:是的,我已经尝试了几件事。例如它确实声明了一个变量OPENGL_LIBRARIES,我试过了,但问题不在于这里的链接步骤。
  • 是的,cmake 变量区分大小写。尝试使用正确的OPENGL_INCLUDE_DIR。在 MacOS 上使用 CMake,这应该是 gl.h 的完整路径。问题是 Mac OS 上的框架有奇怪的包含路径。
  • 是的,我也试过了,那个变量打印的值是正确的,但是——令我惊讶的是——我得到了上面提到的那个错误。
  • 我必须恢复我之前的陈述,正如您所说,大写 OPENGL_FOUND 确实有所作为。我否认了这一点,因为我以前曾尝试过,但要知道是否有用。所以肯定有一些令人困惑的变量发生了变化。

标签: c macos opengl cmake


【解决方案1】:

这很常见

#if defined(__APPLE__)
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#endif

您可以在 glfw、glew、sfml 等中以一种或另一种形式看到此操作

【讨论】:

  • 奇怪的是,它适用于&lt;OpenGL/gl.h>,尽管我确信我已经尝试过了。您能否详细说明包含过程是如何工作的,即当标头不在具有该名称的目录中而是在上述 .framework/Headers 目录中时,为什么我要在 OpenGL 前面加上前缀?
【解决方案2】:

我很惊讶您在 OS X 10.10 的 /System/Library/Frameworks 中找到了 OpenGL 标头。我不认为它们已经在很多 Xcode 版本中安装在那里。在 10.10 上使用 Xcode 6.1 的最新头文件应位于:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers

您实际上并不需要知道这条路径,除非您想查看标题。我相信编译器会自动使用与您正在编译的操作系统匹配的 SDK。如果出于某种原因您想为不同的平台构建,您可以使用 -isysroot 编译器选项覆盖该逻辑。

对于来自框架的头文件,您在#include 语句中使用的命名是:

#include <FrameworkName/HeaderFileName.h>

编译器会将其解析为框架内标头的实际路径名。

因此,如果要使用来自 OpenGL 框架的当前 OpenGL 标头,即 gl3.h,正确的 include 语句为:

#include <OpenGL/gl3.h>

这将使您能够访问受支持的最高 OpenGL 版本的核心配置文件(如果您有相当新的 Mac,则为 3.x 或 4.x)。或者,如果您想使用具有旧功能的 OpenGL 2.1:

#include <OpenGL/gl.h>

【讨论】:

  • 我没有安装 Xcode,当我意识到可以单独安装 cmdline 工具时我放弃了它。但是如果我使用上面的cmake文件并更正OpenGL_FOUND的大小写,虽然我只使用#include &lt;gl.h&gt;而不使用框架名称(&lt;OpenGL/gl.h&gt;也可以),但会找到标题。
【解决方案3】:

正如 pmr 所指出的,CMake 变量是区分大小写的,所以必须查询变量OPENGL_FOUND。 此外,正如 PeterT 所写,标头在 OS X 上包含为 #include &lt;OpenGL/gl.h&gt;

【讨论】:

    【解决方案4】:

    在更新从自制软件安装的 qt 后,我​​最终遇到了这个问题,并且出现了相同的错误消息。离开 Reto 的评论后,我将 CMAKE_OSX_SYSROOT 更新为 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk,一切都恢复正常。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2013-11-15
      • 1970-01-01
      相关资源
      最近更新 更多