我在OS X 10.10上,尝试用GLUT和OpenGL构建C'项目。 我将它简化为展示我的问题的最小示例。我有以下CMakeLists.txt
:cmake在OS X上找不到gl.h的文件
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块不能执行,c)glut.h
不会出现这种问题?在这花了几个小时,无法理解为什么。
正确的变量是'OPENGL_FOUND'。所有其他变量也是如此。使用大写的'OPENGL'。 'FindOpenGL'也不设置'LIBRARY_DIR'。你真的在看文档吗? – pmr 2014-11-04 21:42:09
大写或无在这里没有任何区别。我也不确定它是否可以(?) 关于变量:是的,我尝试了几件事情。比如它声明了一个变量'OPENGL_LIBRARIES',我试过了,但问题不在于这里的连接步骤。 – oarfish 2014-11-04 22:02:47
是的,cmake变量是区分大小写的。尝试使用正确的'OPENGL_INCLUDE_DIR'。对于MacOS上的CMake,这应该是'gl.h'的完整路径。问题是Mac OS上的框架有很奇怪的包含路径。 – pmr 2014-11-04 22:25:03