cmake在OS X上找不到gl.h

时间:2014-11-04 21:22:53

标签: c macos opengl cmake

我在OS X 10.10上并尝试建立一个C'项目'使用GLUT和OpenGL。 我把它简化为一个展示我问题的最小例子。我有以下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处于相同的结构中(只需用GLUT替换OpenGL)并找到正好。另外,令我感到困惑的是,if(GLUT_FOUND)...中的块永远不会被执行(尝试将message语句放入其中),但在打印的变量中它表示OPENGL_FOUND=TRUE。但是删除if条件不会改变任何东西。

实际问题:到底是怎么回事?为什么a)cmake除非特别包含,否则找不到标题,b)尽管OPENGL_FOUND打印为TRUE,if-block仍未执行,c)glut.h没有出现此类问题?花了好几个小时,无法理解为什么。

4 个答案:

答案 0 :(得分:8)

这很常见

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

您可以在glfw,glew,sfml等中以某种形式看到这种情况

答案 1 :(得分: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>

答案 2 :(得分:0)

正如bei pmr所指出的,CMake变量区分大小写,因此必须查询变量OPENGL_FOUND。 另外,正如PeterT所写,标题在OS X上包含为#include <OpenGL/gl.h>

答案 3 :(得分:0)

在更新从自制软件安装的qt之后,我最终遇到了这个问题,并且出现了相同的错误消息。根据Reto的评论,我将CMAKE_OSX_SYSROOT更新为None,一切恢复正常。