cmake在OS X上找不到gl.h

我在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  #include  int main() { return 0; } 

现在, cmake . 运行正常,出于调试目的打印所有变量。 我从某个地方拿了代码,我不太了解cmake知道它是否按照我的想法行事。 无论如何,运行make返回

 main.c:1:10: fatal error: 'gl.h' file not found #include  ^ 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)if-block不执行虽然OPENGL_FOUND打印为TRUE,c) glut.h没有出现这样的问题? 花了好几个小时,无法理解为什么。

这很常见

 #if defined(__APPLE__) #include  #include  #else #include  #include  #endif 

您可以在glfw,glew,sfml等中以这种或那种forms看到这种情况

我很惊讶你在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  

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

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

 #include  

这将使您可以访问支持最高的OpenGL版本的核心配置文件(如果您有一个合理的新Mac,则为3.x或4.x)。 或者,如果您想将OpenGL 2.1与旧版function一起使用:

 #include  

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